1.存在重复元素 II
题目

解析
- 每次更新哈希表时,相同数字对应下标值更新为最新下标;
代码
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
// 时间复杂度:O(n)
// 空间复杂度:O(n)
int n = nums.size();
unordered_map<int,int> cnt;
for(int j = 0;j < n;j ++){
auto it = cnt.find(nums[j]);
if(it != cnt.end()){
if(abs(j - it->second) <= k) return true;
}
cnt[nums[j]] = j;// 存储最新下标
}
return false;
}
};
2.必须拿起的最小连续卡牌数
题目

解析
代码
class Solution {
public:
int minimumCardPickup(vector<int>& cards) {
// 时间复杂度:O(n)
// 空间复杂度:O(n)
int n = cards.size();
int ans = INT_MAX;
unordered_map<int,int> cnt;
for(int j = 0;j < n;j ++){
auto it = cnt.find(cards[j]);
if(it != cnt.end()){
ans = min(ans,j - it->second + 1);
}
cnt[cards[j]] = j;
}
if(ans != INT_MAX) return ans;
else return -1;
}
};
3.总持续时间可被60整除的歌曲
题目

解析
代码
class Solution {
public:
int numPairsDivisibleBy60(vector<int>& time) {
// 时间复杂度:O(n + U),U = 60
// 空间复杂度:O(n)
int n = time.size();
int ans = 0;
unordered_map<int,int> cnt;// 存的是 nums[i] % 60
for(int j = 0;j < n;j ++){
auto it = cnt.find((60 - time[j] % 60) % 60);
if(it != cnt.end()){
ans += it->second;
}
cnt[time[j] % 60] ++;
}
return ans;
}
};
4.构成整天的下标对数目 II
题目

解析
代码
class Solution {
public:
long long countCompleteDayPairs(vector<int>& hours) {
// 时间复杂度:O(n + U),U = 24
// 空间复杂度:O(n)
int n = hours.size();
long long ans = 0;
unordered_map<int,int> cnt;
for(int j = 0;j < n;j ++){
auto it = cnt.find((24 - hours[j] % 24) % 24);
if(it != cnt.end()){
ans += it->second;
}
cnt[hours[j] % 24] ++;
}
return ans;
}
};
5.数组列表中的最大距离
题目

解析
- 最大值无非两种情况,前尾 - 后头 / 后尾 - 前头;这里使用了 back() 方法获取末尾元素;
代码
class Solution {
public:
int maxDistance(vector<vector<int>>& arrays) {
// 时间复杂度:O(n)
// 空间复杂度:O(1)
int n = arrays.size();
int ans = 0;
int mn = INT_MAX / 2,mx = INT_MIN / 2;// 防止减法溢出
for(auto& it : arrays){
ans = max({ans,mx - it[0],it.back() - mn});
mx = max(mx,it.back());
mn = min(mn,it[0]);
}
return ans;
}
};