0%

力扣每日两题2022/2/23

283.移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 方法一:
def moveZeroes1(nums):
if len(nums) == 0:
return nums
k = 0
lst1 = []
for i in nums:
if i == 0:
k += 1
lst1.append(i)
for item in lst1:
nums.append(0)
k -= 1
nums.remove(item)
return nums

# 方法二: 双指针
def moveZeroes2(nums):
if len(nums) == 0:
return nums
left = 0
right = 1
n = len(nums)
while right < n:
if nums[left] == 0 and nums[right] != 0:
nums[left],nums[right] = nums[right],nums[left]
right += 1
left += 1
elif nums[left] == 0 and nums[right] == 0:
right += 1
elif nums[left] != 0:
left += 1
right += 1
return nums

if __name__ == '__main__':
nums = [0,1,0,3,12]
nums1 = [0]
print(moveZeroes2(nums))

167.两数之和 II - 输入有序数组

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

你所设计的解决方案必须只使用常量级的额外空间。

示例 1:

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

示例 2:

输入:numbers = [2,3,4], target = 6
输出:[1,3]
解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。

示例 3:

输入:numbers = [-1,0], target = -1
输出:[1,2]
解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 方法一:
def twoSum(nums,target):
for i in range(len(nums)):
for j in range(i + 1,len(nums)):
if nums[i] + nums[j] == target:
return [i+1,j+1]
# 方法二:
def twoSum2(nums,target):
for i in range(len(nums)):
b = target - nums[i]
if b in nums:
return sorted([i+1,nums.index(b)+1])
# 方法三:
def twoSum3(nums,target):
for i in range(len(nums)):
b = target - nums[i]
if b > nums[i]:
left = i + 1
right = len(nums) - 1
while left <= right:
mid = (left + right) // 2
if b < nums[mid]:
right = mid - 1
elif b > nums[mid]:
left = mid + 1
else:
return [i+1,mid+1]
elif b < nums[i]:
left = 0
right = i - 1
if right >= 0:
while left <= right:
mid = (left + right) // 2
if b < nums[mid]:
right = mid - 1
elif b > nums[mid]:
left = mid + 1
else:
return [i+1,mid+1]
else:
return [i+1,i+1+1]

# 方法四:
def twoSum4(nums,target):
i,j=0,len(nums) - 1
while i < j:
if nums[i] + nums[j] < target:
i += 1
elif nums[i] + nums[j] > target:
j -= 1
else:
return [i+1,j+1]


if __name__ == '__main__':
nums = [2,7,11,15]
nums2 = [2,3,4]
nums3 = [-1,0]
nums4 = [0,0,3,4]
print(twoSum(nums,9))
print(twoSum2(nums2,6))
print(twoSum3(nums3,-1))
print(twoSum4(nums4,0))