Leetcode704 and Leetcode 27
复习数组相关内容
数组的存储是连续且类型相同的,所以对数组进行增删操作时,其余元素地址也会发生变化
元素的地址是连续的(二维同)
但其实并不能删除它,只能进行修改他的值
Leetcode704 打卡:利用二分法查找数组中的target
左闭右开写法
是left=mid+1 或 right=mid
class Solution:
def search(self, nums: List[int], target: int) -> int:
#1.根据左闭合区间来看
left=0
right=len(nums)-1
mid=int((left+right)/2)
while nums[mid]!=target and left<right:
if nums[mid]<target:
left=mid+1
else:
right=mid
mid=int((left+right)/2)
if nums[mid]==target:
return mid
else:
return -1
左闭右闭写法
#修改right为right=mid-1
right=mid-1
Conclusion
利用二分法查找的前提是数组是有序且不重复的,要根据对区间的定义来写出区间的等式。
时间复杂度O(log n),空间复杂度O(1)
Leetcode27 打卡:移除数组中与要求元素相等的所有元素
要求空间复杂度O(1)
方法一:暴力搜索
整体思路:当数组中有与val相等的值时,将该数之后的部分整体向前移动。
注:移动时最后一位的下角标要记得随着变化 n-=1
时间复杂度:O(n2) 空间复杂度:O(1)
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
#方法一:暴力搜索
n=len(nums)
k=0
i=0
while i<n:
if nums[i]==val:
for j in range(i+1,n):
nums[j-1]=nums[j]
n-=1#注意这个问题
i-=1
else:
k+=1
i+=1
return k
方法二:双指针
这一题的双指针指:
- 一个快指针:遍历数组的
- 一个慢指针:当快指针找到目标值的时候,慢指针固定不动,直到快指针指向的不是目标值时,才将此处的值改为当前快指针所指向的值
优点:将两个for循环省为一个 时间复杂度:O(n)
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
#方法二:双指针
fast,slow=0,0
n=len(nums)
while fast<n:
if nums[fast]!=val:
nums[slow]=nums[fast]
slow+=1
fast+=1
return slow
参考 代码随想录leetcode-master/README.md at master · youngyangyang04/leetcode-master · GitHub