LeetCode面试题Day15|LC219 存在重复元素Ⅱ、LC229 汇总区间
题目一:219重复元素
指路:
. - 力扣(LeetCode)219 存在重复元素Ⅱ
思路与分析:
本题要求找出在数组中相距在(0, k]内且元素值相同的数。那么我们定义一个哈希表,用数组中元素作为键,将其出现的下标作为值。键唯一时值为出现的下标,当下标差小于等于k时返回true,否则返回false。
代码:
class Solution {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {unordered_map<int, int> map; // 用数组中的值做键,用出现的下标做值构成键值对for (int i = 0; i < nums.size(); i++) {int key = nums[i];if (map.count(key) && i - map[key] <= k) return true;map[key] = i;}return false;}
};
题目二:汇总空间
指路:
. - 力扣(LeetCode)228 汇总空间
思路与分析:
因为本题要求返回的是vector的string类型,那么我们定义一个最终结果集。题意非常明确,当一个区间内数字连续时将首尾元素添加到字符串内加上特定符号返回。当首尾元素一致时返回首元素字符串。那么我们将起始指针定在数组的元素首位置,当后面一个数值与其差值为1时终止元素后移直到相邻两元素不连续,此时将连续的起止指针转换为字符串并在中间加入指定字符"->"。
代码:
class Solution {
public:vector<string> summaryRanges(vector<int>& nums) {vector<string> ret; // 最终结果集int i = 0;int n = nums.size();while (i < n) {int low = i; // 区间起始指针i++;while (i < n && nums[i] == nums[i - 1] + 1) {i++; // 当前后两个数差为1时区间终止后移一个}int high = i - 1; string tmp = to_string(nums[low]); // 起始指针从int转成字符串if (low < high) {tmp.append("->"); // 添加符号tmp.append(to_string(nums[high])); // 添加终止指针指向元素}ret.push_back(move(tmp));// tmp表示指定的左值对象,move函数返回tmp对象的右值形式,将其添加进最终结果集}return ret;}
};