2道题都有一样的问题,拿到题目没感觉,之后看完答案基本可以手写,应该是生疏的问题。
二分查找704. 二分查找 - 力扣(LeetCode)
for left>=right
和while差不多意思,go没有while只有for循环,当左边界大于等于右边界则说明二分结束了,已查找完区间,若是左闭右闭则可以等于。
二分区间划分为①[a,b],②[a,b)
但是不知道为什么一般这样划(后续补充)
①:
for left>=right{
mid:=left+(right-left)/2
if nums[mid]>target{
right=mid--
}else if nums[mid]<target{
left=mid++
}else {
return mid
}
}
判断分三种情况,if语句中不能加等号因为等于就找到了,不需要再划分区间了,因为是闭区间,所以nums[mid]>target则nms【mid】一定不等于target,所以从后一位开始就可以了。
二分法逻辑是先划分二分区间,分两种情况,如果都不是则说明找到了。
补充一下go的if语句好久没写了忘完了:
和c++差不多,else if加判断条件可以有很多条,else只准一条并且没有判断条件。
题目拿到手也没想法,不知道怎么做,不知道是没有深入理解的原因,总是看了答案懂了怎么做就做出来了,但是好像少了点什么,也许是对逻辑的思考。
这个题不能新建数组,答案用双指针解决,我至今未知为什么要使用双指针,我的理解是一个用来扫描,一个用来保存。
for right<len(nums);right++{
if nums[right]!=val{
nums[slow]=nums[right]
slow++
}
}
思路是l和r指针,r负责扫描数组,而扫描到的正确的数就放入数组,即用nums[l]来实现,放入之后l后移一位,若扫描到要删除的数,则不操作就行,最后相当于把需要的数都放入了nums,生成了新数组。
用len()来输出数组长度,数组存放于一段连续的地址,开辟了就不能更改大小只能移位子,如果想要删元素,其实只能新建数组。这个也只不过是整体前移,后面有空的,长度仍不变。