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(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 }
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(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 }