代码随想录算法训练营第一天 | 704.二分查找、27.移除元素

1,289 阅读2分钟

704.二分查找

题目链接:leetcode.cn/problems/re… 文档详解:代码随想录 (programmercarl.com)

视频详解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili

  • 看到题目的第一想法:

    只想二分,没觉得难也没觉得简单,然后就直接上手做了。 一般做题时有这种感觉,要么是完全会,要么是必踩坑。显然我不是完全会的那批。

  • 看完随想录后的想法: 发现自己一开始直接二分的想法完全就是莽,根本没考虑到边界和每个元素只比一次的严谨性。而且视频题解在这题的切入点和逻辑都很流畅,比如从一开始先想到不同解法的max、min定义,再到二分查找循环的比较条件等等。我一边看一边顿悟,脑子说它会了。

  • 实现过程遇到的困难:

    逻辑错:诸如每次迭代时max、min忘记+-1和min<=max搭配容易在找不到时产生无限循环等。手:会了但没完全会。

    语法错:想用for循环写,结果for(int min=0,max=nums.size()-1;;)不认max;for(int min=0,int max=nums.size()-1;;)不认2个定义语句,最后只好做罢啦。

  • 收获与学习时长:

    最后还是做出来啦,耗时6小时……毕竟谁没有第一次呢?

  • 代码:(29ms只击败了64%)

class Solution { public: int search(vector<int>& nums, int target) { int min=0, max=nums.size()-1,len=(max+min)/2; for(;min<=max;len=(max+min)/2){ if(target==nums[len]){ return len; } else if(target<nums[len]){ max=len-1; } else{ min=len+1; } } return -1; } };

27.移除元素

题目链接:leetcode.cn/problems/re… 文档详解:代码随想录 (programmercarl.com)

视频详解:数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili

  • 代码: class Solution { public: int removeElement(vector<int>& nums, int val) { int left=0,right=0; for(int i=0;i<nums.size();i++){ if(nums[i]!=val){ nums[left]=nums[right]; left++; } right++; } return left; } };