力扣-697. 陣列的度

DawnTraveler發表於2024-04-25

1.題目介紹

題目地址(697. 陣列的度 - 力扣(LeetCode))

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.length150,000 範圍內。
  • nums[i] 是一個在 049,999 範圍內的整數。

2.題解

2.1 雜湊表

思路

key值儲存元素值, value儲存一個數值,有三個值,分別儲存出現次數,出現位置和結束位置

程式碼

class Solution {
public:
    int findShortestSubArray(vector<int>& nums) {
        unordered_map<int, vector<int>> mp;
        for(int i = 0; i < nums.size(); i++){
            int num = nums[i];
            if(mp.count(num)){
                mp[num][0]++;
                mp[num][2] = i;
            }
…                minLen = mp[num][2] - mp[num][1] + 1;
            } else if(mp[num][0] == maxNum){
                minLen = min(minLen, mp[num][2] - mp[num][1] + 1);
            }
        }

        return minLen;
    }
};

複雜度分析

令 n 為陣列長度。

  • 時間複雜度:\(O(n)\)
  • 空間複雜度:\(O(n)\)

相關文章