ji那天好像是周六。。。。。吃完饭意识到貌似今天要有比赛(有题解当然要做啦),跑回寝室发现周日才开始233333
======================================================================
leetcode217 Contains Duplicate
leetcode219 Contains Duplicate II
leetcode228 Summary Ranges
=======================================================================
217讲的是
给你n个数字,判断下是否有重复的数据出现。
我的思路
丢到unordered_map里检查下就行。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Solution { 2 public: 3 bool containsDuplicate(vector<int>& nums) { 4 int n=nums.size(); 5 unordered_map<int,int> m; 6 for(int i=0;i<n;i++){ 7 if(m.find(nums[i])==m.end()){ 8 m[nums[i]]=1; 9 }else return true; 10 } 11 return false; 12 } 13 };
讨论版里没有什么新奇的思路。。。
=======================================================================
219讲的是
给你n个数字和一个数字k,判断下是否有重复的数据出现在任意长度为k的区间内。
也就是说如果有任意ij满足nums[i]==nums[j]&&abs(i-j)<=k则返回真
我的思路
丢到unordered_map里检查下就行。。。距离小于i-k的erase掉就好。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Solution { 2 public: 3 bool containsNearbyDuplicate(vector<int>& nums, int k) { 4 int n=nums.size(); 5 unordered_map<int,int> m; 6 for(int i=0;i<min(n,k+1);i++){ 7 if(m.find(nums[i])==m.end()){ 8 m[nums[i]]=1; 9 }else return true; 10 } 11 for(int i=min(n,k+1);i<n;i++){ 12 m.erase(nums[i-k-1]); 13 if(m.find(nums[i])==m.end()){ 14 m[nums[i]]=1; 15 }else return true; 16 } 17 return false; 18 } 19 };
恩,其实这种判断元素存在性的题目,用set会更好些。
========================================================================
228讲的是
给你n个数字(有序,无重),把点转化为区间。
比如输入[0,1,2,4,5,7],输出["0->2","4->5","7"](字符串数组)
我的思路
线性的扫就好了。。。O(n)啊。。。不知道为什么难度被定义为中等。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Solution { 2 public: 3 vector<string> summaryRanges(vector<int>& nums) { 4 int n=nums.size(); 5 vector<string> aim; 6 if(!n)return aim; 7 int s=nums[0],t=nums[0]; 8 for(int i=1;i<n;i++){ 9 if(nums[i]!=nums[i-1]+1){ 10 t=nums[i-1]; 11 char temp[30]; 12 if(s==t) 13 sprintf(temp,"%d",s); 14 else sprintf(temp,"%d->%d",s,t); 15 string s_temp(temp); 16 aim.push_back(s_temp); 17 s=nums[i]; 18 } 19 } 20 t=nums[n-1]; 21 char temp[30]; 22 if(s==t) 23 sprintf(temp,"%d",s); 24 else sprintf(temp,"%d->%d",s,t); 25 string s_temp(temp); 26 aim.push_back(s_temp); 27 return aim; 28 } 29 };
我想使用to_string函数来着的,但是我的codeblocks一直报错。。。重装系统+VS当做官方IDE已经迫在眉睫了