?697. 數(shù)組的度
難度:簡(jiǎn)單
給定一個(gè)非空且只包含非負(fù)數(shù)的整數(shù)數(shù)組 nums
,數(shù)組的 度 的定義是指數(shù)組里任一元素出現(xiàn)頻數(shù)的最大值。
你的任務(wù)是在 nums
中找到與 nums
擁有相同大小的度的最短連續(xù)子數(shù)組,返回其長(zhǎng)度。
示例 1:
輸入:nums = [1,2,2,3,1]
輸出:2
解釋:
輸入數(shù)組的度是 2 ,因?yàn)樵?1 和 2 的出現(xiàn)頻數(shù)最大,均為 2 。
連續(xù)子數(shù)組里面擁有相同度的有如下所示:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
最短連續(xù)子數(shù)組 [2, 2] 的長(zhǎng)度為 2 ,所以返回 2 。
示例 2:
輸入:nums = [1,2,2,3,1,4,2]
輸出:6
解釋:
數(shù)組的度是 3 ,因?yàn)樵?2 重復(fù)出現(xiàn) 3 次。
所以 [2,2,3,1,4,2] 是最短子數(shù)組,因此返回 6 。
提示:
-
nums.length
在1
到50,000
范圍內(nèi)。 -
nums[i]
是一個(gè)在0
到49,999
范圍內(nèi)的整數(shù)。
??思路:哈希表
使用哈希表,key
保存的是整數(shù),value
保存一個(gè)數(shù)組,里面右三個(gè)數(shù),分別為該整數(shù)出現(xiàn)的次數(shù)、第一次出現(xiàn)的位置,和最后一次出現(xiàn)的位置;
并設(shè)置變量max
和maxNum
,記錄哪個(gè)整數(shù)出現(xiàn)的次數(shù)最大,及對(duì)應(yīng)的value
置,在遍歷數(shù)組的時(shí)候不斷更新;
注意有可能數(shù)組中出現(xiàn)頻率最大數(shù)的整數(shù)不止一個(gè),這時(shí)我們要取較短的那個(gè)。
??代碼:(Java、C++)
Java
class Solution {
public int findShortestSubArray(int[] nums) {
int max = 0;
int maxNum = 0;
HashMap<Integer, int[]> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
if(!map.containsKey(nums[i])){
int[] tem = {1, i, i};
map.put(nums[i], tem);
}else{
map.get(nums[i])[0]++;
map.get(nums[i])[2] = i;
}
if(map.get(nums[i])[0] > max){
max = map.get(nums[i])[0];
maxNum = nums[i];
}else if(map.get(nums[i])[0] == max && map.get(nums[i])[2] - map.get(nums[i])[1] < map.get(maxNum)[2] - map.get(maxNum)[1]){
maxNum = nums[i];
}
}
return map.get(maxNum)[2] - map.get(maxNum)[1] + 1;
}
}
C++
class Solution {
public:
int findShortestSubArray(vector<int>& nums) {
int max = 0;
int maxNum = 0;
unordered_map<int, vector<int>> map;
for(int i = 0; i < nums.size(); i++){
if(map.find(nums[i]) == map.end()){
map[nums[i]] = {1, i, i};
}else{
map[nums[i]][0]++;
map[nums[i]][2] = i;
}
if(map[nums[i]][0] > max){
max = map[nums[i]][0];
maxNum = nums[i];
}else if(map[nums[i]][0] == max && map[nums[i]][2] - map[nums[i]][1] < map[maxNum][2] - map[maxNum][1]){
maxNum = nums[i];
}
}
return map[maxNum][2] - map[maxNum][1] + 1;
}
};
?? 運(yùn)行結(jié)果:
?? 復(fù)雜度分析:
-
時(shí)間復(fù)雜度:
O
(
n
)
O(n)
O(n),其中
n
為數(shù)組的長(zhǎng)度。 - 空間復(fù)雜度: O ( n ) O(n) O(n),最壞情況下,哈希表和原數(shù)組等大。
題目來(lái)源:力扣。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-433569.html
放棄一件事很容易,每天能堅(jiān)持一件事一定很酷,一起每日一題吧!
關(guān)注我 leetCode專欄,每日更新!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-433569.html
注: 如有不足,歡迎指正!
到了這里,關(guān)于( 數(shù)組和矩陣) 697. 數(shù)組的度 ——【Leetcode每日一題】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!