day01 - 数组
704. 二分查找
class Solution { public: int search(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; int middle = 0; while(left <= right){ middle = left+(right-left)/2;//(left + right) / 2; if(nums[middle] == target) return middle; else if(nums[middle] > target) right = middle - 1; else left = middle + 1; } return -1; } };
35. 搜索插入位置
class Solution { public: int searchInsert(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; int middle = 0; while(left <= right){ middle = left + (right - left)/2; cout << middle << endl; if(nums[middle] == target) return middle; else if(nums[middle] > target) right = middle - 1; else left = middle + 1; } cout << "left:" << left << ", right:" << right << endl; return left; } };
34. 在排序数组中查找元素的第一个和最后一个位置
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; int middle = 0; bool left_stop = false; bool right_stop = false; while(left <= right){ middle = left + (right - left)/2; if(nums[middle] == target) break; else if(nums[middle] > target) right = middle - 1; else left = middle + 1; } if(left > right) return vector<int>{-1, -1}; left = right = middle; cout << middle << endl; //向左向右寻找不是target就停止 while(!left_stop || !right_stop){ if(left - 1 >= 0 && nums[left - 1] == target) left--; else left_stop = true; if(right + 1 < nums.size() && nums[right + 1] == target) right++; else right_stop = true; } return vector<int>{left, right}; } };
27. 移除元素
class Solution { public: int removeElement(vector<int>& nums, int val) { vector<int>::iterator it; for(it=nums.begin();it!=nums.end();){ if(*it == val) nums.erase(it); else it++; } return nums.size(); } };