LeetCode Day01 704. & 27.

发布时间 2023-10-12 16:47:58作者: 数码暴龙猪

###### [704. Binary Search](https://leetcode.cn/problems/binary-search/)
入门必备二分查找了。
必须是在一堆**有序的**数组中找到其中特定某个val值。
###### 二分算法的思路:
*首先取一个基准值,这个值我们一般取数组的中间位置,也就是把(左边下标 + 右边下标)/2得到这一数组中间位置的下标,然后拿这个下标所在的数值和目标val作比较,如果中间数比val值大,按照这个数组是升序这一性质,那val值一定在数组的左半部分区域,这时候我们需要更新数组下标;如果中间数比val值小,那val就一定在数组的右半部分区域。按照这个思路来看就可以知道为什么二分查找的前提条件必须是数组有序了。二分的大体思路如此。此外就是需要特别注意边界的问题,如果循环的时候是left<=right那么更新中间数下标的时候,if (nums[mid] > target) right是可以直接更新到mid - 1,因为left==right是有意义的,所以target不可能是nums[mid]了。eg:第一次提交的时候边界是left<right所以还卡了没通过...*

 

以下是题解:

class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] > target){
right = mid - 1;
} else if (nums[mid] < target){
left = mid + 1;
} else{
return mid;
}
}

return -1;
}
}

  

###### 第二题是元素移除:[27. Remove Element](https://leetcode.cn/problems/remove-element/)

###### 解题思路
*这题可以用暴力也可以使用双指针,用双指针的思路是,先用一个指针遍历这个数组,如果遍历过程中遇到想要移除的元素,我们直接继续往下遍历直到出现一个不是这个移除元素的数字把它给覆盖掉。比方说这里例子想要把2移除,数组是[2,3,3,2],当我们遍历到第0号位数的时候指针继续往下走,遍历到1号位置的3时,3就往前一位把2给覆盖掉,为了记录遍历过后的指针走到哪个具体位置,因此我们需要再多一个指针。*

public int removeElement(int[] nums, int val) {
int index1 = 0;
for(int index2 = 0; index2 < nums.length; index2 ++){
if(nums[index2] != val){
nums[index1 ++] = nums[index2];
}
}
return index1;
}

 

二刷感想:就是没什么感想,从提交记录来看我反复做过六次第二道题了,时长间隔一年有余。第一次刷应该是抄的答案,因为代码写得很工整而且提交都出错肯定不是我自己写的(逃走。 显然一年前的我做这个题的时候根本没理解双指针吧,刚刚运行调试俩次通过以后想回来写总结,看到自己之前写的备注和记录,又感觉都已经把该写的都写完了。。嘛。。。希望有天我对着dp的题目也能这么轻松咯…… 唯一的感想真的就是刷多了就好啦(自己也是这样告诉自己的)然而刷题这条路真的太枯燥了,有时候看到一些人算法思想一遍就过去了,甚至举一反三把同类型的题刷得起飞,就会感觉自己be like a monkey啊… 会遇到行业寒冬吧,迷茫的时候觉得这条路真黑,一个人走不知道啥时候是头,这些b题也不知道刷了有什么用,想了想闲着还是刷刷吧,不要抱怨了。

想对自己说的:要认真要坚持要进步要乐观要积极!不要抱怨不要摆烂不要失去信心不要诅咒世界!下一题见!