704.二分查找
由于之前已经学过二分查找的基本思想,所以就不再赘述。这里主要对两种不同区间写法进行说明。
左闭右闭
这种情况下,由于左右都是能取到的,所以在初始定义区间时,要写为
left=0;right=len(nums)-1
- while(left<=right)要写成<=,因为当left==right时是有意义的。
- if nums[i]>target: right=mid-1.因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
左闭右开
这种情况下,由于是[left,right),所以初始区间定义,要写为
left=0;right=len(nums)
- while(left<right)要写成<,因为当left==right,无法取到[left,left)
- if nums[i]>target: right=mid.因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
27.移除元素
这道题如果使用暴力解法复杂度还是太高了,比较好的想法是去使用双指针解决这道题。
快指针去判断当前位置元素是否等于目标元素;慢指针负责去记录不同元素的数量
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow=0;fast=0
for fast in range(len(nums)):
if(nums[fast] != val):
nums[slow]=nums[fast]
slow+=1
return slow
977.有序数组的平方
本题同样去使用快慢指针的思路;
快慢指针常见的有两种,一种是同一起点的,快指针先移动,慢指针后移动。还有一种是分别在列表的两端,共同向中间移动。
由于数组是有序的,那么数组的值进行平方后,最大的值肯定会出现在列表的首尾,由这个性质我们可以利用双指针的思想。将最大的值存入一个新的列表中,然后进行指针的移动。
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
left=0;right=len(nums)-1
result=[0]*len(nums)
k=len(result)-1
while left <= right:
if nums[left]*nums[left]>nums[right]*nums[right]:
result[k]=nums[left]*nums[left]
k-=1
left+=1
else:
result[k]=nums[right]*nums[right]
k-=1
right-=1
return result