题目简介
704: 二分查找 https://leetcode.cn/problems/binary-search/
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值target ,写一个函数搜索nums中的 target,如果目标值存在返回下标,否则返回 -1。
27: 移除元素 https://leetcode.cn/problems/remove-element/
给你一个数组 nums和一个值 val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
初见思路
704: 二分查找,经典的算法了,重点是识别区间开闭性和寻找中间点时的溢出问题。
27:原地移除元素,使用双指针,可以选择直接遍历,遇到非target的元素和上一个与target值相等的元素互换位置;也可以两端到中间进行遍历。
按照个人思路给出以下解:
# 704
class Solution:
def search(self, nums: List[int], target: int) -> int:
l,r = 0,len(nums)-1
mid = None
while l <= r:
mid = l + (r - l) // 2
if nums[mid] == target:
return mid
elif nums[mid] > target:
r = mid - 1
elif nums[mid] < target:
l = mid + 1
return -1
## 27
# 暴力解法
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
idx = cnt = 0
for i in range(len(nums)):
if nums[i] != val:
nums[idx] = nums[i]
idx += 1
cnt += 1
return cnt
# 一种更适合双指针逻辑的解法
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
if not nums or len(nums) == 0:
return 0
l,r = 0,len(nums)-1
while l < r:
while (l<r) and nums[l] != val:
l += 1
while (l<r) and nums[r] == val:
r -= 1
nums[r],nums[l] = nums[l],nums[r]
return l if nums[l] == val else l + 1
# 对于数组,不要只想顺序遍历,聚合/分散都要考虑,遍历的方式不唯一
复盘思路
https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html#%E6%80%9D%E8%B7%AF
重点难点
见原文复盘思路
今日收获
- 数组基本知识
- 二分查找和双指针的应用