class Solution { public: int findShortestSubArray(vector<int>& nums) { unordered_map<int, vector<int>> mp; int n = nums.size(); for (int i = 0; i < n; i++) { if (mp.count(nums[i])) { mp[nums[i]][0]++; mp[nums[i]][2] = i; } else { mp[nums[i]] = {1, i, i}; } } int maxNum = 0, minLen = 0; for (auto& [_, vec] : mp) { if (maxNum < vec[0]) { maxNum = vec[0]; minLen = vec[2] - vec[1] + 1; } else if (maxNum == vec[0]) { if (minLen > vec[2] - vec[1] + 1) { minLen = vec[2] - vec[1] + 1; } } } return minLen; } }; 逐行解释一下
时间: 2024-02-14 21:28:42 浏览: 150
这段代码是一个解决数组问题的C++类Solution。下面逐行解释它的功能:
1. 创建一个unordered_map,用于存储数字和对应的信息。这里使用unordered_map是为了快速查找和插入操作。
2. 获取数组的长度n。
3. 使用for循环遍历数组中的每个元素。
4. 判断当前元素是否已经存在于unordered_map中,即mp.count(nums[i])是否为真。如果为真,则表示当前元素已经出现过。
5. 如果当前元素已经出现过,则更新该元素在unordered_map中对应的信息。mp[nums[i]][0]表示当前元素出现的次数加1,mp[nums[i]][2]表示当前元素最后出现的位置。
6. 如果当前元素是第一次出现,则将其加入unordered_map中,并用{1, i, i}表示其出现次数、第一次出现的位置和最后一次出现的位置。
7. 初始化最大出现次数maxNum和最短子数组长度minLen为0。
8. 使用range-based for循环遍历unordered_map中的每个键值对。其中[_, vec]表示对键值对进行解构绑定,_表示键,vec表示值。
9. 如果当前元素出现次数大于maxNum,则更新maxNum和minLen。maxNum等于vec[0],表示当前元素的出现次数;minLen等于vec[2] - vec[1] + 1,表示当前元素的最短子数组长度。
10. 如果当前元素出现次数等于maxNum,则比较minLen和vec[2] - vec[1] + 1的大小,更新minLen为较小值。
11. 返回最短子数组长度minLen作为结果。
这段代码的功能是找到数组中出现次数最多的元素的最短子数组长度。
阅读全文