一、给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数
class Solution:
def firstMissingPositive(self, nums: List[int]) -> int:
m = 1
n = len(nums)
if n == 0:
return m
nums.sort()
for i in nums:
if i == m:
m += 1
return m
二、如何用rand7生成rand10
def rand_10():
r1 = rand_7()
r2 = rand_7()
r = (r1 - 1) * 7 + r2
a = True
while a:
if 1 <= r <= 40:
num = (r-1)%10 + 1
a = False
return num
三、给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
形成三角形的条件为两小边之和大于第三边,明确条件后确定思路:
- 将给定数组排序,使小边在左,大边在右
- 从 n u m s [ 2 ] nums[2] nums[2]开始遍历数组, i i i指向本次遍历范围的最大边
- 定位左右指针,左指针初始指向
n
u
m
s
[
0
]
nums[0]
nums[0],右指针初始指向
n
u
m
s
[
i
−
1
]
nums[i - 1]
nums[i−1]
- 若左 + 右 <= 大边, l + 1 l + 1 l+1
- 若左 + 右 > 大边,则 [ l , r ) [l ,r) [l,r)范围内任取一个数作为 n u m s [ l ] nums[l] nums[l],均可达到 n u m s [ l ] + n u m s [ r ] > n u m s [ i ] nums[l] + nums[r] > nums[i] nums[l]+nums[r]>nums[i],res += r - l
class Solution:
def triangleNumber(self, nums: List[int]) -> int:
n = len(nums)
nums.sort()
num = 0
if n == 3:
if nums[0] + nums[1] > nums[2]:
return 1
else:
return 0
else:
for i in range(2, n):
l, r = 0, i-1
while l < r:
if nums[l] + nums[r] > nums[i]:
num += r - l
r -= 1
else:
l += 1
return num
四、最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target最接近。返回这三个数的和。假定每组输入只存在唯一答案。
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
n = len(nums)
nums.sort()
res = float('inf')
for i in range(n):
if i > 0 and nums[i] == nums[i-1]:
continue
else:
l, r = i+1, n-1
while l < r:
cur_sum = nums[i] + nums[l] + nums[r]
if cur_sum == target:
return target
elif cur_sum < target:
l += 1
else:
r -= 1
if abs(cur_sum - target) < abs(res - target):
res = cur_sum
return res