day4
1.剑指 Offer 03. 数组中重复的数字
1)排序+遍历查找
1 class Solution { 2 public: 3 int findRepeatNumber(vector<int>& nums) { 4 sort(nums.begin(),nums.end()); 5 int n = nums.size();int i; 6 for(i = 0;i < n - 1;i ++) 7 if(nums[i] == nums[i + 1]) 8 break; 9 return nums[i]; 10 } 11 };
2)哈希
1 class Solution { 2 public: 3 int findRepeatNumber(vector<int>& nums) { 4 unordered_map<int,bool> map; 5 int res; 6 for(auto x : nums){ 7 if(map[x]){ 8 res = x; 9 break; 10 } 11 map[x] = true; 12 } 13 return res; 14 } 15 };
3)原地交换
1 class Solution { 2 public: 3 int findRepeatNumber(vector<int>& nums) { 4 int n = nums.size(); 5 int res,i = 0; 6 while(i < n){ 7 if(nums[i] == i){ 8 i ++; 9 continue; 10 } 11 if(nums[i] == nums[nums[i]]) 12 { 13 res = nums[i]; 14 break; 15 } 16 swap(nums[i],nums[nums[i]]); 17 } 18 return res; 19 } 20 };
2.剑指 Offer 53 - I. 在排序数组中查找数字 I
1 class Solution { 2 public: 3 int search(vector<int>& nums, int target) { 4 int n = nums.size(); 5 int l = 0,r = n - 1,mid; 6 int flag = 0; 7 while(l <= r){ 8 mid = l + (r - l) / 2; 9 if(nums[mid] == target){ 10 flag = 1; 11 break; 12 } 13 else if(nums[mid] < target) 14 l = mid + 1; 15 else 16 r = mid - 1; 17 } 18 if(! flag) return 0; 19 int cnt = 0; 20 for(int i = mid;i >= 0;i --){ 21 if(nums[i] == nums[mid]) 22 cnt ++; 23 else 24 break; 25 } 26 for(int i = mid + 1;i < n;i ++){ 27 if(nums[i] == nums[mid]) 28 cnt ++; 29 else 30 break; 31 } 32 return cnt; 33 } 34 };
3.剑指 Offer 53 - II. 0~n-1 中缺失的数字
双指针+二分
1 class Solution { 2 public: 3 int missingNumber(vector<int>& nums) { 4 int n = nums.size(); 5 int i,j; 6 for(i = 0,j = n - 1;i <= j;){ 7 int mid = (i + j) / 2; 8 if(nums[mid] != mid) 9 j = mid - 1; 10 else 11 i = mid + 1; 12 } 13 return i; 14 } 15 };

浙公网安备 33010602011771号