704-二分查找
题目链接https://leetcode.cn/problems/binary-search/
其实读完题目我就在没带电脑的情况下用手机写了
当时也没有想太多就直接跟着自己的逻辑写了一个,但后来看了随想录才发现有左闭右闭和左闭右开两个情况,我这个就是属于左闭右闭的情况,那么这两种情况说白了就是0~nums.length-1和0 ~nums.length。在通俗一点就是左边界和右边界的取值问题。这两种情况也就直接影响到while循环里的语句,如果是左闭右闭就是left小于等于right,另一种情况则是小于,如果还是不太清楚可以举个例子:数组为[1,2,4],target是3。在这种情况下左闭右闭是left=0,right=2,mid=1。while第一次循环时,因为mid索引的值为2小于3所以左边界要发生变化,那为啥要变成mid+1而不是mid,因为mid索引对应的值已经比较完了,另一种情况也同理。接下来左索引被付值为了2而右索引也是2,那么这个时候循环是否需要继续呢?一定要继续,因为右索引的值还没有和target的值进行比较,所以while还要执行,这时mid为2而mid所对应的值大于target,所以要改变右索引,右索引就变成了1,这时全部元素已经与target进行了比较,所以循环也可以停止,显而易见右索引小于左索引,所以这边解释了循环里的语句。
!看完随想录以后我发现我写的还是有个小问题,我没有加一个条件,就是当target的值小于0索引的值或大于length-1时则直接返回-1,这样可以避免多次循环运算。
27-移除元素
题目链接
https://leetcode.cn/problems/remove-element/
其实写的很糙,但我觉得大致的逻辑也没什么问题,也成功通过了,我写的时候就是想怎么才能在空间复杂度为O(1)的情况下完成呢,后来看了随想录的题解原来这个叫双指针,当时我只是觉得既然数组只能覆盖,那么我就可以找出那些和val不同的数,然后把他们覆盖在和val相同的位置,这时候我想到引入一个变量j,用它来表示扣去与val相同的数以后新数组的长度,我写的for循环里就是干这件事的,将于val不同的数从0索引开始依次付值。这就是j干的事。当然这题也有暴力解法,第一个循环遍历数组,第二个循环更新数组,这里注意第二个for循环的条件是满足i索引对应的值等于val时才会走第二个循环来进行从i+1位置依次往前覆盖来更新数组的操作