代码随想录刷题第一天 | 704. 二分查找,27. 移除元素
- 704. 二分查找
- 收获
- 27. 移除元素
- 收获
704. 二分查找
题目链接:二分查找
这里使用二分法有前提就是得是有序数组,而且还得是无重复的数字,如果有重复的数字,二分法出来的结果应该就不会是唯一的。
第一种写法,左右都是闭区间
class Solution {
public:int search(vector<int>& nums, int target) {//写一下第一种情况,即middle 在【left,right】 都是闭区间int left =0;int right = nums.size()-1; while(left<=right){ //由于是左闭右闭 所以这里left<=rightint middle = left+((right-left)/2); //这样写防止溢出if(nums[middle]>target){right = middle-1;}else if(nums[middle]<target){left = middle+1;}elsereturn middle;}return -1;}
};
第二种写法,左闭区间 右边是开区间 【left,right)
class Solution {
public:int search(vector<int>& nums, int target) {//第二种写法 即左闭右开 int left = 0;int right = nums.size();while(left < right){int middle = left + ((right-left)>>1); //这里做位运算,等价除以2if(nums[middle]>target){right = middle;}else if(nums[middle]<target){left = middle+1;}else return middle;}return -1;}
};
收获
第二种写法的那里,有个位运算,看leetcode 的运行速度,位运算好像快蛮多。
27. 移除元素
题目链接:27 移除元素
两种方法 1 暴力就完事了 2 双指针 快慢指针
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;}
};
下一种聪明方法 :快慢指针
class Solution {
public:int removeElement(vector<int>& nums, int val) {int slowindex = 0;for(int fastindex = 0;fastindex<nums.size();fastindex++){if(nums[fastindex]!=val){nums[slowindex++]=nums[fastindex];}}return slowindex;}
};
收获
写完看别人的介绍,才想起有 库函数可以直接用,完了,又得重新看这些知识,难受