15 三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
if len(nums) < 3:
return []
nums.sort()
res = []
for i in range(len(nums)-2):
if nums[i] > 0:
return res
if i>0 and nums[i] == nums[i-1]:
continue
L = i+1
R = len(nums)-1
while L<R:
while L>i+1 and nums[L] == nums[L-1] and L<R:
L+=1
while R<len(nums)-1 and nums[R] == nums[R+1] and L<R:
R -=1
if L<R:
if nums[i] + nums[L] + nums[R] == 0:
res.append([nums[i],nums[L],nums[R]])
L+=1
R-=1
elif nums[i] + nums[L] + nums[R] < 0:
L+=1
else:
R-=1
return res
16 最接近三数之和
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
min_distance = 0x1<<31
min_Sum = 0
for i in range(len(nums)-2):
L = i+1
R = len(nums)-1
while R>L:
threeSum = nums[i] + nums[L] +nums[R]
if min_distance >abs(threeSum-target):
min_distance = abs(threeSum-target)
min_Sum = threeSum
if threeSum == target:
return target
elif threeSum<target:
L+=1
else:
R-=1
return min_Sum
31 下一个排列
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
idx1 = -1
for i in range(len(nums)-1,-1,-1):
if i>0 and nums[i] > nums[i-1]:
idx1 = i-1
break
if idx1 == -1:
nums[:] = nums[::-1]
return
idx2 = -1
for i in range(len(nums)-1,-1,-1):
if nums[idx1] < nums[i]:
idx2 = i
break
nums[idx1],nums[idx2] = nums[idx2], nums[idx1]
nums[idx1+1:] = nums[-1:idx1:-1]
return
34. 在排序数组中查找元素的第一个和最后一个位置
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
left = 0
right = len(nums)-1
while right>=left:
mid = (right+left)//2
if nums[mid] == target:
left_idx = mid
right_idx = mid
while left_idx>0 and nums[left_idx] == nums[left_idx-1]:
left_idx -= 1
while right_idx<len(nums)-1 and nums[right_idx] == nums[right_idx+1]:
right_idx += 1
return [left_idx, right_idx]
elif nums[mid] < target:
left = mid +1
else:
right = mid - 1
return [-1, -1]
48 旋转图像
class Solution:
def helper(self, nums):
nums[:] = [nums[-1]] + nums[:-1]
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
matrix_len = len(matrix)
for i in range(matrix_len):
if i > matrix_len-1-i:
return
nums = [matrix[i][i],matrix[i][matrix_len-1-i],matrix[matrix_len-1-i][matrix_len-1-i],matrix[matrix_len-1-i][i]]
self.helper(nums)
matrix[i][i],matrix[i][matrix_len-1-i],matrix[matrix_len-1-i][matrix_len-1-i],matrix[matrix_len-1-i][i] = nums[0],nums[1],nums[2],nums[3]
for j in range(i+1,matrix_len-i-1):
# nums = [matrix[i,j],matrix[j,matrix_len-1-i],matrix[matrix_len-1-i,matrix_len-1-j],matrix[matrix_len-1-j,i]]
nums = [matrix[i][j],matrix[j][matrix_len-1-i],matrix[matrix_len-1-i][matrix_len-1-j],matrix[matrix_len-1-j][i]]
self.helper(nums)
[matrix[i][j],matrix[j][matrix_len-1-i],matrix[matrix_len-1-i][matrix_len-1-j],matrix[matrix_len-1-j][i]] = nums[0], nums[1], nums[2], nums[3]
54 螺旋矩阵
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
res = []
while matrix:
res.extend(matrix.pop(0))
matrix[:] = list(map(list,zip(*matrix)))[::-1]
return res
56 合并区间
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals.sort(key = lambda item:item[0])
i = 0
while i<len(intervals):
item = intervals[i]
if i < len(intervals)-1 and item[1] >= intervals[i+1][0]:
intervals.pop(i)
item_next = intervals.pop(i)
intervals.insert(i, [item[0],max(item_next[1],item[1])])
else:
i+=1
if i >= len(intervals):
break
return intervals
leetcode 7道数组题目 python
最新推荐文章于 2024-09-16 06:54:08 发布