leetcode 数组类型题总结

1,removeDuplicates(I)

 1 int removeDuplicatesI(vector<int>& nums){  // 重新组织数组,同 removeDuplicates2IV
 2     int index = 0;
 3     for(int i=0;i<nums.size();++i){
 4         if(i>0 && nums[i] == nums[i-1])
 5             continue; 
 6         nums[index++] = nums[i];
 7     }
 8     return index;
 9 } 
10 int removeDuplicatesII(vector<int>& nums) { // 数组覆盖操作 
11     if(nums.empty()) return 0;
12     int index = 1;
13     for(int i=1;i<nums.size();++i) {
14         if(nums[i-1] != nums[i])
15             nums[index++] = nums[i];
16     }
17     return index;
18 }
19 int removeDuplicatesIII(vector<int>& nums) {  //  STL::hashmap 
20     map<int,int> mapping;
21     if(nums.empty()) return 0;
22     for(int i=0;i<nums.size();++i) {
23         if(mapping.find(nums[i]) != mapping.end())
24             mapping[nums[i]] += 1;
25         else
26             mapping[nums[i]] = 1;
27     }
28     return mapping.size();
29 }
30 int removeDuplicatesIV(vector<int>& nums) {   // STL::set
31     set<int> myset;
32     for(int i=0;i<nums.size();++i)
33         myset.insert(nums[i]);
34     return myset.size();
35 }
36 int removeDuplicatesV(vector<int>& nums) {    // STL::unique,STL::distance
37     return distance(nums.begin(),unique(nums.begin(),nums.end()));
38 }
removeDuplicates(I)

 removeDuplicates(II)

 1 int removeDuplicates2I(vector<int>& nums) {  //  STL::haspmap 
 2     map<int,int> mapping;
 3     for(int i=0;i<nums.size();++i) {
 4         if(mapping.find(nums[i]) != mapping.end()){
 5             if(mapping.find(nums[i])->second == 2)
 6                 mapping.find(nums[i])->second = 2;
 7             else
 8                 mapping.find(nums[i])->second += 1;
 9         }
10         else
11             mapping[nums[i]] = 1;
12     }
13     int result=0;
14     for(map<int,int>::iterator it = mapping.begin();it != mapping.end();++it) {
15         result += it->second;
16     }
17     return result;
18 }
19 int removeDuplicates2II(vector<int>& nums) { // 思路同  removeDuplicatesII,覆盖操作,扩展性好 
20     if(nums.size()<3) return nums.size();
21     int index = 2; // index表示将要覆盖的三个相同元素的最后一个元素位置 
22     for(int i=2;i<nums.size();++i) {
23         if(nums[i] != nums[index-2])
24             nums[index++] = nums[i]; // 覆盖三个相同元素的最后一个 
25     }
26     return index;
27 }
28 int removeDuplicates2III(vector<int>& nums) {  // STL::erase 函数 
29     if(nums.size()<3) return nums.size();
30     for(vector<int>::iterator it=nums.begin();it!=nums.end()-2;++it)
31         if(*it == *(it + 1) && *it == *(it + 2))
32             it = nums.erase(it);
33     return nums.size();
34 } 
35 int removeDuplicates2IV(vector<int>& nums) {  // 重新组织数组 
36     int index = 0;  // index 表示下次放元素的位置 
37     for(int i=0;i<nums.size();++i){
38         if(i>1 && i<nums.size()-1 && nums[i]==nums[i-1] && nums[i]==nums[i+1])
39             continue; // 和左右两边相等的元素跳过(不放入重组数组中) 
40         nums[index++] = nums[i];
41     } 
42     return index;
43 }
removeDuplicates(II)

2, search(I)

 1 int search1(const vector<int>& nums,int target) {
 2     int first = 0;
 3     int last = nums.size()-1;
 4     while(first <= last) {
 5         int mid = first + (last - first)/2;
 6         if(nums[mid]==target) 
 7             return mid;
 8         else if(nums[first]<=nums[mid]) { // mid在左半部分 
 9             if(nums[first]<=target && target<nums[mid])
10                 last = mid - 1;
11             else
12                 first = mid + 1; 
13         }    
14         else {                         // mid在右半部分 
15             if(nums[mid]<target && target<=nums[last])
16                 first = mid + 1;
17             else
18                 last = mid - 1; 
19         }
20     }
21     return -1;
22 }
search(I)

 search(II)

 1 int search2(const vector<int>& nums,int target) {
 2     int first = 0;
 3     int last = nums.size()-1;
 4     while(first <= last) {
 5         int mid = first + (last - first)/2;
 6         if(nums[mid]==target)
 7             return mid;
 8             
 9         if(nums[first]<=nums[mid]) {      // mid 在左半部分 
10             if(nums[first]<nums[mid]) {   // nums[first] < nums[mid]
11                 if(nums[first]<=target && target<nums[mid])
12                     last = mid - 1;
13                 else
14                     first = mid + 1;
15             }
16             else                        // nums[first] == nums[mid]
17                 first++;                // 缩短查找区间 
18         }
19         else {                         //  nums[first] > nums[mid],mid 在右半部分 
20             if(nums[mid]<target && target<=nums[last])
21                 first = mid +1;
22             else
23                 last = mid - 1;
24         }
25     }
26     return -1;
27 }
search(II)

猜你喜欢

转载自www.cnblogs.com/zpcoding/p/10397630.html