2017-3-11 leetcode 217 219 228

ji那天好像是周六。。。。。吃完饭意识到貌似今天要有比赛(有题解当然要做啦),跑回寝室发现周日才开始233333

======================================================================

leetcode217 Contains Duplicate

leetcode219 Contains Duplicate II

leetcode228 Summary Ranges

=======================================================================

217讲的是
给你n个数字,判断下是否有重复的数据出现。

我的思路
丢到unordered_map里检查下就行。。。

 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 };
217

讨论版里没有什么新奇的思路。。。

=======================================================================

219讲的是
给你n个数字和一个数字k,判断下是否有重复的数据出现在任意长度为k的区间内。
也就是说如果有任意ij满足nums[i]==nums[j]&&abs(i-j)<=k则返回真

我的思路
丢到unordered_map里检查下就行。。。距离小于i-k的erase掉就好。。。

 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 };
219

恩,其实这种判断元素存在性的题目,用set会更好些。

========================================================================

228讲的是
给你n个数字(有序,无重),把点转化为区间。
比如输入[0,1,2,4,5,7],输出["0->2","4->5","7"](字符串数组)

我的思路
线性的扫就好了。。。O(n)啊。。。不知道为什么难度被定义为中等。。

 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 };
228

我想使用to_string函数来着的,但是我的codeblocks一直报错。。。重装系统+VS当做官方IDE已经迫在眉睫了

posted @ 2017-03-11 15:17  徐王  阅读(137)  评论(0编辑  收藏  举报