代码随想录算法训练营|Day 1
Day 1内容:
数组理论基础
文章链接:https://programmercarl.com/数组理论基础.html
题目
- 977.有序数组的平方
题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
文章讲解:https://programmercarl.com/0977.有序数组的平方.html
个人情况:
今天三道题目中两道题目我之前自己刷过,参考资料有代码随想录网站上的内容与力扣上别人的题解。今天可以算作是部分复习加上部分新知识。
二分查找
二分查找的区间问题:
在这道题,数组中要么是<target的元素,要么是>=target的元素。定义一个区间的意义在于,左区间外的都是<target的,右区间外都是>=target的。通过找到数组中第一个>=target的元素,并看它是否是target自身,可以确定数组中是否有该元素,并确定返回内容
[left, right]:
点击查看代码
while left <= right:
mid = left + (right-left) //2
if num[mid] >= target:
right = mid-1
else:
left = mid + 1
#循环结束时区间无元素
#循环结束后区间变成[right, left]
#left=right+1
#左区间外都<target,那么left就是第一个>=target的元素
#return left
点击查看代码
while left < right:
mid = left + (right-left) //2
if num[mid] >= target:
right = mid
else:
left = mid + 1
#循环结束时区间无元素
#循环结束后区间变成left=right [left,right)
#左区间外都<target,那么left就是第一个>=target的元素
#return left or right均可
点击查看代码
while left +1 < right:
mid = left + (right-left) //2
if num[mid] >= target:
right = mid
else:
left = mid
#循环结束时区间无元素
#循环结束后区间变成left+1=right (left,right)
#左区间外都<target, 由于开区间,left本身就在区间外
#因此nums[left] < target
#left+1即right才是第一个>=target的元素
#return right or left+1
双指针/快慢指针
fast指针负责遍历列表,slow指针记录不符合要求的位置(这个元素我们不想要它在那个位置)。
如果元素在合适的位置,slow和fast会同步前进。一旦遇到了不合适的,slow会停止,fast继续。
当fast遇到了合适的,就和slow位置的交换。然后slow再正常前进。
704.二分查找
点击查看代码
class Solution:
def search(self, nums: List[int], target: int) -> int:
left,right = 0,len(nums)-1
while left <= right:
mid = left + (right-left) //2
if nums[mid] >= target:
right = mid-1
else:
left = mid+1
if left < len(nums) and nums[left] == target:
return left
else:
return -1
27.移除元素
点击查看代码
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow = 0
fast = 0
while fast <= len(nums)-1:
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow
点击查看代码
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
n=len(nums)
ans = [0]*n
i,j,p=0,n-1,n-1
while i <= j:
x = nums[i]*nums[i]
y = nums[j]*nums[j]
if x > y:
ans[p] = x
i += 1
else:
ans[p] = y
j -= 1
p -= 1
return ans

浙公网安备 33010602011771号