数组理论基础
1.数组是存放在连续内存空间上的相同类型数据的集合。
2.数组的元素是不能删除的,只能覆盖。
3.不同语言不一样,在C++中,二维数组是连续分布的
704.二分查找
题目
思路与解法
第一想法: 简单的二分查找,三个指针:left、right、mid。while left <= right 就持续进行二分查找。若是直到 left > right 都没找到,就是找不到了。
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums) - 1
while left <= right :
mid = (left + right) // 2
if target == nums[mid]:
return mid
elif target < nums[mid]:
right = mid -1
else:
left = mid + 1
return -1
carl的讲解: 二分法有一个比较重要的思想 循环不变量。循环不变量 是指,在二分查找中,保持不变量(区间的定义就是不变量),就是在while寻找每一次边界的 处理逻辑 都要坚持根据区间的定义来操作。简单来说,怎么定义区间,就决定了数据取舍的逻辑。
27.移除元素
题目
思路与解法
第一想法:
1.暴力法,找到一个就把后面的提上来,如下:
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
lens = len(nums)
i = 0
while i < lens:
# print(i)
if nums[i] == val:
# print(nums[i])
j = i
while j < lens-1 :
nums[j] = nums[j+1]
j += 1
lens = lens - 1
else:
i = i + 1
print(lens)
return lens
2.快慢指针。慢指针是最终结果,快指针是用于遍历。 起初,快指针一直往后遍历,当值不等于value时,慢指针等于快指针;当遇到与value相同的值时,慢指针停下,快指针继续往后。如下:
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow = fast = 0
lens = len(nums)
while fast < lens:
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
fast += 1
elif nums[fast] == val:
fast += 1
return slow
977.有序数组的平方
题目
思路与解法
第一想法: 1. 暴力法
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
for i in range(len(nums)):
nums[i] = nums[i] * nums[i]
nums.sort()
return nums
carl: 双指针。想要速度快,自然要想到用空间换
# 双指针(提前定义定长列表)
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
res = [float('inf')] * len(nums)
left = 0
right = len(nums) -1
i = len(nums) -1
while left <= right:
if nums[left] * nums[left] > nums[right] * nums[right]:
res[i] = nums[left] * nums[left]
i -= 1
left += 1
else :
res[i] = nums[right] * nums[right]
right -= 1
i -= 1
# res.reverse()
return res
# 双指针 + 反转列表
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
res = []
left = 0
right = len(nums) -1
while left <= right:
if nums[left] * nums[left] > nums[right] * nums[right]:
res.append(nums[left] * nums[left])
left += 1
else :
res.append(nums[right] * nums[right])
right -= 1
# res.reverse()
return res[::-1]