leetcode-697. 數組的度刷題筆記(c++)

寫在前面

  • 難度:簡單,,,
  • 注意事項:連續子序列(1開始沒理解1臉懵逼)
  • 核心思想
    • unordered_map<int, vector<int>>
      • 元素值作爲key
      • 元素在數組中的下標存儲爲vector<int>
        • vector是一種順序容器
          • 順序容器指的是元素排列次序與元素的值無關,而是由元素添加到容器裏的次序決定

題目詳情

給定一個非空且只包含非負數的整數數組 nums, 數組的度的定義是指數組裏任一元素出現頻數的最大值。

你的任務是找到與 nums 擁有相同大小的度的最短連續子數組,返回其長度。

示例 1:
	輸入: [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:

	輸入: [1,2,2,3,1,4,2]
	輸出: 6
	注意:
	
	nums.length 在1到50,000區間範圍內。
	nums[i] 是一個在0到49,999範圍內的整數。

ac代碼

  • 算法思想
    • 循環計算元素頻數最大值
      • 頻數較大,更新最短子序列值
      • 頻數相等,子序列較短則更新子序列值
class Solution
{
public:
    int findShortestSubArray(vector<int> & nums)
    {
        unordered_map<int, vector<int>> umap;
        int n = nums.size();
        // 將數組中元素封裝值umap
        for(int i=0; i<n; i++)
            umap[nums[i]].push_back(i);

        int msqLen = 1000000;
        int cnt = 0;
        for(auto it=umap.begin(); it!=umap.end(); it++)
        {
            // 當前元素出現頻數
            int pcnt = it->second.size();

            // 當前元素頻數大於歷史頻數最大值,則更新頻數最大值、最短連續子序列
            if(pcnt > cnt)
            {
                cnt = it->second.size();
                msqLen = it->second[pcnt-1] - it->second[0] + 1;
            }
            // 當前元素頻數等於歷史頻數最大值
            if(pcnt == cnt)
            {
                // 當前元素頻數對應最短子序列長度小於歷史最短子序列長度,則更新最短子序列值
                if(msqLen > it->second[pcnt-1]-it->second[0] + 1)
                    msqLen = it->second[pcnt-1]-it->second[0] + 1;
            }
        }
        return msqLen;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章