一、題目大意
https://leetcode.cn/problems/degree-of-an-array
給定一個非空且只包含非負數的整數陣列 nums,陣列的 度 的定義是指陣列里任一元素出現頻數的最大值,
你的任務是在 nums 中找到與 nums 擁有相同大小的度的最短連續子陣列,回傳其長度,
示例 1:
輸入:nums = [1,2,2,3,1]
輸出:2
解釋:
輸入陣列的度是 2 ,因為元素 1 和 2 的出現頻數最大,均為 2 ,
連續子陣列里面擁有相同度的有如下所示:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
最短連續子陣列 [2, 2] 的長度為 2 ,所以回傳 2 ,
示例 2:
輸入:nums = [1,2,2,3,1,4,2]
輸出:6
解釋:
陣列的度是 3 ,因為元素 2 重復出現 3 次,
所以 [2,2,3,1,4,2] 是最短子陣列,因此回傳 6 ,
提示:
- nums.length 在 1 到 50,000 范圍內,
- nums[i] 是一個在 0 到 49,999 范圍內的整數,
二、解題思路
首先給陣列的度下一個定義,給一個陣列,某個或某些數字出現最多的次數為該陣列的度,題目要求我們找到最短的子陣列使其和原陣列擁有相同的度,
思路:統計每個數字出現的次數,用哈希來建立數字與出現次數的映射,我們要求與該陣列有相同度的最小長度子陣列,我們要知道每個數字的度,與其首次出現的位置,這樣我們要定義兩個哈希一個來存出現的次數,一個來存首次出現的位置,我們再定義一個變數degree來表示陣列的度,遍歷陣列當前遍歷位置可以看作是最后一次出現的位置即尾位置,累加當前數字出現的次數,如果數字是第一次出現,建立數字與首位置的映射,如果當前數字的出現次數等于degree時,當前位置為尾位置,用endIndex - startIndex + 1來更新結果;如果當前數字的出現次數大于degree,說明之前的結果代表的數字不是出現最多的,直接將結果更新為endIndex - startIndex + 1,然后degree也更新為當前數字出現的次數,
三、解題方法
3.1 Java實作
public class Solution {
public int findShortestSubArray(int[] nums) {
Map<Integer, Integer> countMap = new HashMap<>();
Map<Integer, Integer> firstIdxMap = new HashMap<>();
int ans = nums.length;
int degree = 0;
for (int i = 0; i < nums.length; i++) {
int num = nums[i];
countMap.put(num, countMap.getOrDefault(num, 0) + 1);
// 記錄首位置
if (countMap.get(num) == 1) {
firstIdxMap.put(num, i);
}
if (countMap.get(num) == degree) {
ans = Math.min(ans, i - firstIdxMap.get(num) + 1);
} else if (countMap.get(num) > degree) {
ans = i - firstIdxMap.get(num) + 1;
degree = countMap.get(num);
}
}
return ans;
}
}
四、總結小記
- 2208/8/23 這兩天天氣不錯
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/502585.html
標籤:其他
上一篇:介面測驗
