704. 二分查找
如果声明 right = nums.size()-1 那么left<=right是有意义的。区间是[l,r],这个时候更新区间,就是right = mid - 1,left = mid + 1
如果声明 right = num.size(),那么说明right是不可取的,只能是left<right,区间是[l,r),这个时候更新区间,就是right = mid ,left = mid + 1
第一种写法
class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] > target) {right = mid - 1;} else if (nums[mid] < target) {left = mid + 1;}else{return mid;}}return -1;}
};
第二种写法
class Solution {
public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size();while (left < right) {int mid = left + (right - left) / 2;if (nums[mid] > target) {right = mid ;} else if (nums[mid] < target) {left = mid + 1;}else{return mid;}}return -1;}
};
27. 移除元素
暴力法或者双指针法
暴力法需要注意的是交换元素的时候不要仅仅交换一个,而是要当出现需要删除的元素时,一直将这个元素交换到数组末尾,再处理i和size双指针法需要明确双指针代表的含义,在本题中,快指针是用来找需要存在数组中的元素,慢指针则是用来确定新数组的下标的
双指针法
class Solution {
public:int removeElement(vector<int>& nums, int val) {//fast是用来找数组中不等于val的元素//slow是用来确定新数组的下标int slow = 0;for (int fast = 0; fast < nums.size(); fast++) {if (nums[fast] != val){nums[slow] = nums[fast];slow++;}}return slow;}
};
暴力法
class Solution {
public:int removeElement(vector<int>& nums, int val) {int size = nums.size();for (int i = 0; i < size; i++) {if (nums[i] == val) {for (int j = i + 1; j < size; j++) {nums[j - 1] = nums[j];}i--;size--;}}return size;}
};
977. 有序数组的平方
双指针法
class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {vector<int> result(nums.size(), 0);int left = 0;int right = nums.size() - 1;int index = nums.size() - 1;while (left <= right) {if (nums[left] * nums[left] < nums[right] * nums[right]) {result[index] = nums[right] * nums[right];right--;} else {result[index] = nums[left] * nums[left];left++;}index--;}return result;}
};