所以使用len(nums)-k,而不是-k
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
k=k%len(nums)
nums[:]=nums[len(nums)-k:]+nums[:len(nums)-k]
#防止k是0
#原地修改使用切片重新赋值
#防止k做完
#return
三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
不重复,先使用排序,然后三个数中的第一个数选择后(一定是操作完之后),再选择一个新数。
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums=sorted(nums)
ans,r=[],[]
length_nums=len(nums)
for i in range(length_nums-2):
if i>=1 and nums[i]==nums[i-1]:
continue
item,per=nums[i],[nums[i]]
left,right=i+1,length_nums-1
while(left<right):
while(left<right and left>i+1 and nums[left]==nums[left-1]):
#print(nums[left])
left+=1
while(left<right and right<length_nums-1 and nums[right]==nums[right+1]):
right-=1
if left==right:
break
''' '''
if nums[left]+nums[right]+item<0:
left+=1
elif nums[left]+nums[right]+item>0:
right-=1
else:
#print(left,right)
ans.append([item,nums[left],nums[right]])
left+=1
#right-=1也可
return ans
移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
标解:条件嵌套与双指针经常一起使用。
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
n = len(nums)
left = right = 0
while right < n:
if nums[right] != 0:
nums[left], nums[right] = nums[right], nums[left]
left += 1
right += 1
我的解
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
if len(nums)<=1:
return
#类似于快速排序算法,,错误思路
#走到0后面没有0算结束
left,flag=0,False
while( not flag):
if left==len(nums):
flag=True
idx=left
while(idx<len(nums) and nums[idx]==0):
idx+=1
if idx==len(nums):
break
#flag=True
if idx==left:
left+=1
#if left==4:
#ptint("here")
else:
#print(nums[:left],nums[idx:],nums[left:idx])
nums[:]=nums[:left]+nums[idx:]+nums[left:idx]
在空间上和时间上都有浪费,在整个列表复制那一行
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
实例
网友评论