一、数组理论
- 数组下标都是从0开始的。
- 数组内存空间的地址是连续的
- 正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。
- vector的底层实现是array,严格来讲vector是容器,不是数组。
- 数组的元素是不能删的,只能覆盖。
- 在C++中二维数组在地址空间上是连续的
二、二分查找
题目链接:704.二分查找
思路
题目的前提:数组有序+元素不重复
关键点:边界条件的写法 1.[left,right] 2.[left,right)
[left,right]
1.while(left<=right)
2.if (nums[middle] < target) left = middle + 1
if (nums[middle] > target) right = middle - 1
[left,right)
1.while(left<right)
2.if (nums[middle] < target) left = middle + 1
if (nums[middle] > target) right=middle
##python
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left, right = 0, len(nums) - 1
while left <= right:
middle = left + (right - left) // 2
if nums[middle] == target:
return middle
elif nums[middle] < target:
left = middle + 1
elif nums[middle] > target:
right = middle - 1
return -1
三、移除元素
题目链接:27.移除元素
思路
数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
暴力方法:两层for循环,一个for循环遍历数组元素 ,第二个for循环更新数组。
双指针法(快慢指针法):通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向更新 新数组下标的位置
##python
class Solution(object):
# def removeElement(self, nums, val):
# """
# :type nums: List[int]
# :type val: int
# :rtype: int
# """
# i,size = 0,len(nums)
# while i < size:
# if nums[i] == val:
# for j in range(i+1,size):
# nums[j-1] = nums[j]
# i -= 1
# size -= 1
# i += 1
# return size
def removeElement(self, nums, val):
slow,fast = 0,0
size = len(nums)
while fast < size:
if nums[fast] != val:
nums[slow] = nums[fast]
slow +=1
fast += 1
else:
fast += 1
return slow