题目一:搜索插入位置
解题思路:
先不管题目要求的时间复杂度即使用二分查找的方法,本题可以直接使用暴力解决,重点是数组两端元素的插入的讨论,这里我们可以将两端元素单独拎出来进行讨论,因为我们知道数组中的元素是按由小到大顺序排序的。
AC代码:
暴力:
if target in nums:
return nums.index(target)
else:
if target<nums[0]:
return 0
elif target>nums[-1]:
return len(nums)
else:
for i in range(len(nums)):
if target>nums[i] and target<nums[i+1]:
return i+1
二分查找:
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums)
while left < right:
mid = left + (right - left)//2 # 防溢出
if nums[mid] < target: # 中点小于目标值,在右侧,可以得到相等位置
left = mid + 1 # 左闭,所以要+1
else:
right = mid # 右开,真正右端点为mid-1
return left # 或right,返回谁都一样
题目二:找出3位偶数
解题思路:
1、直接将数组中的数三个一组,再筛选出符合条件的数
2、总共就是一个三位数,即在100~999之间,所以可以直接将其中所有的偶数算出为一组,再将数组中的数三个一组在偶数组的留下输出即可
AC代码:
1、
class Solution:
def findEvenNumbers(self, digits: List[int]) -> List[int]:
return sorted(set(a*100+b*10+c for a,b,c in permutations(digits,3)if a and c %2==0))
2、
class Solution:
def findEvenNumbers(self, digits: List[int]) -> List[int]:
# 列表保存0-9
c1 = [0] * 10
for i in digits:
c1[i] += 1
ans = []
for i in range(100, 999, 2):
a, b, c = i // 100, i % 100 // 10, i % 10
flag = 0
tmp = [0] * 10
for j in [a, b, c]:
tmp[j] += 1
# 不满足条件
if tmp[j] > c1[j]:
flag = 1
if flag == 0:
ans.append(i)
return ans