目录
今日任务:
- 数组理论基础
- 704.二分查找
- 27.移除元素
数组理论基础:
文章链接:代码随想录 (programmercarl.com)
- 数组是存放在连续内存空间上的相同类型数据的集合
- 数组下标都是从0开始,内存空间是连续的(因为数组的内存空间是是连续的,因此在增加或者删除元素时,难免要移动其他元素的地址)
- 数组的元素不能删除,只能覆盖
704.二分查找
思路:
二分法前提条件:
- 数组为有序且无重复元素
二分法第一种写法([left,right]):
分析:
- while(left<=right) 要使用<=,因为left==right是有意义的,所以使用<=
- if (nums[middle]>target) right 要赋值就要为middle-1,因为此时的nums[middle]一定不为target,那么接下来要查找的右区间为middle-1
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
while left <= right:
middle = left + (right - left) // 2
if nums[middle] < target:
left = middle + 1
elif nums[middle] > target:
right = middle - 1
else:
return middle
return -1
二分法第二种写法([left,right)):
分析:
- while(left<right) 这里使用< ,所以left==right为无意义的,即right区间取不到的
- if(nums[middle] > target) right = middle ,下一个搜索右区间为middle,即:下一个查询区间不会比较nums[middle]
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums)
while left < right:
middle = left + (right - left) // 2
if nums[middle] < target:
left = middle + 1
elif nums[middle] > target:
right = middle
else:
return middle
return -1
27.移除元素
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
思路:
因数组为不可删除,因此只可以覆盖
快慢指针法:
分析:有两个指针,一个快指针在前方对数组进行探测,当发现不满足条件的元素的时候,就将慢指针所指的空间填入该元素,慢指针往后移动一个地址,最终慢指针(下标)即为满足条件的新数组的长度。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
p = 0
for i in range(len(nums)):
if nums[i] != val:
nums[p] = nums[i]
p += 1
return p
暴力法:
分析:
- while i < l 当i小于数组的长度时 继续循环数组
- if nums[i] == val 当发现满足条件的元素时 将后面的元素前移一位 即将满足条件的元素覆盖
注意:之所以用while 不使用 for i in range(l) 因为
range(l)
已经在循环开始时确定了,而不会受到循环中的修改影响。如果你希望在循环中改变循环的迭代次数,使用while
循环并根据需要来控制循环的终止条件。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
i,l = 0,len(nums)
while i < l:
if nums[i] == val:
for j in range(i+1, l):
nums[j-1] = nums[j]
l -= 1
i -=1
i += 1
return l