3/14天打卡:双指针
283. 移动零
数组 | 双指针 |
---|
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
- 第一次提交
136ms
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
for i in nums:
if i==0:
nums.remove(i)
nums.append(0)
return nums
- 第二次看评论区大神
32ms
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
return nums.sort(key=bool, reverse=True)
- 官方题解
36ms
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
slow = fast = 0
while fast < len(nums):
if nums[fast] != 0:
nums[slow] = nums[fast]
slow += 1
fast += 1
for i in range(slow, len(nums)): nums[i] = 0
167. 两数之和 II - 输入有序数组
数组 | 双指针 | 二分查找 |
---|
给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例 1:
输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
示例 2:
输入:numbers = [2,3,4], target = 6
输出:[1,3]
示例 3:
输入:numbers = [-1,0], target = -1
输出:[1,2]
1.常规解法
- [ X ] 超时代码
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
s_index=[]
for i in numbers:
for j in numbers:
if target==i+j:
if j>i:
s_index.append(numbers.index(i)+1)
s_index.append(numbers.index(j)+1)
if j==i:
s_index.append(numbers.index(i)+1)
s_index.append(numbers.index(j)+2)
return s_index[:2]
在控制台测试用例没问题,但提交代码后执行的最后一个代码超时
2.二分法
二分法前提`:是顺序列表,本题是升序列表
- 左右两数相加满足则直接输出
- 左右相加大于目标,右边数较大,依次减一
- 左右相加小于目标,左边数较小,依次加一
- 条件2和3最终要满足条件1
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
left=0
right=len(numbers)-1
while right > left:
if numbers[left] + numbers[right]==target:
return [left+1,right+1]
elif numbers[left] + numbers[right] > target:
right-=1
else:
left+=1