数组理论
1、数组是存放在连续内存空间上的相同类型数据的集合。
2、数组可以方便的通过下标索引的方式获取到下标下对应的数据。
需要两点注意的是:
- 数组下标都是从0开始的。
- 数组内存空间的地址是连续的
3、C++的话,要注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。
4、 数组的元素是不能删的,只能覆盖。
704、二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
关键词:有序、无重复元素(有重复元素查找答案不唯一)
题目链接:力扣题目链接
视频讲题:代码随想录视频讲解
自己题目理解:二分查找相当于折半搜索比较,区分区间边界是左闭右闭还是左闭右开很重要。
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right =0, len(nums)
while left<right: #左闭右开 用<
#while left!=right: #与left<right效果等价
middle=left+(right-left)//2
if nums[middle]>target:
right=middle
elif nums[middle]<target:
#if nums[middle]<target:
left=middle+1
else:
return middle
return -1
# left=0
# right=len(nums)-1
# while left<=right: #左闭右闭 用<=
# middle=left+(right-left)//2
# if nums[middle]>target:
# right=middle-1
# elif nums[middle]<target:
# left=middle+1
# else:
# return middle
# return -1
******一开始,总是报错,结果发现返回的不是下标,而是target。。。
27、移除元素
给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
关键词:双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。
题目链接:力扣题目链接
视频讲题:代码随想录视频讲解链接
自己题目理解:直接暴力求解,设置一个中间数组tmp,当遍历数组nums时,如果当前元素不等于val,则将当前元素添加到tmp中。结果做完发现题目不允许利用新数组,也就是要在现有nums上完成移除重复值的任务。。。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
# i,n=0,len(nums)
# while i<n: #遍历数组
# if nums[i]==val: #遇到val
# for j in range(i+1,n): #遍历后续的数
# nums[j-1]=nums[j] #用后一个数覆盖前一个数
# i=i-1 #覆盖后将遍历的变量再指向前一个数,
# n=n-1 #往前覆盖元素,一次覆盖,数组长度减一
# i=i+1 #往后遍历剩余元素
# return n #暴力题解
#双指针解法
fast=0 #原数组的下标
slow=0 #新数组的更新下标
while fast<len(nums):
if nums[fast]!=val:#当前值不等于val,
nums[slow]=nums[fast]#这时候就将快指针指向的数放到新数组里
slow+=1 #存完一个数,新数组的下标加1,用于存放后续的数
fast+=1 #如果当前值等于val,进行下一次判断
return slow #由于慢指针下标一直在增大,遍历完整个数组时,slow此时正是len(数组长度)