记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
A,B的平均数avg即为nums的平均数
选取k个数 总和=kavg k最多只要考虑半数nums
sum(A) = ksum(nums)/n 如果不存在则可以提前退出
dp[i]存储选取i个数可以得到的sum
def splitArraySameAverage(nums):
"""
:type nums: List[int]
:rtype: bool
"""
n = len(nums)
s = sum(nums)
m = n//2
tag = False
for k in range(1,n+1):
if (s*k)%n==0:
tag = True
break
if not tag:
return False
dp = [set() for _ in range(m+1)]
dp[0].add(0)
for num in nums:
for i in range(m,0,-1):
for j in dp[i-1]:
cur = j+num
if cur*n == s*i:
return True
dp[i].add(cur)
return False
将箱子可装载数量从大到小排序 依次取出
def maximumUnits(boxTypes, truckSize):
"""
:type boxTypes: List[List[int]]
:type truckSize: int
:rtype: int
"""
boxTypes.sort(key=lambda x:x[1],reverse=True)
ans = 0
for i,v in boxTypes:
if i>=truckSize:
ans += truckSize*v
break
ans += i*v
truckSize-=i
return ans
一个局部倒置必定是全局倒置
如果要数量一致 需要满足所有全局倒置都是局部倒置
不存在 i+1nums[j]
检查nums[i] > min(nums[i+2]…nums[n-1])
从后往前 记录最小值 判断nums[i]是否>min
如果成立说明不满足题目条件
def isIdealPermutation(nums):
"""
:type nums: List[int]
:rtype: bool
"""
minv = nums[-1]
n = len(nums)
for i in range(n-2,0,-1):
if nums[i-1]>minv:
return False
minv = min(minv,nums[i])
return True
将每个单词word当前需要匹配的字母放入dic中
从头比那里s 将每个匹配到的字母单词考虑后一个单词
def numMatchingSubseq(s, words):
"""
:type s: str
:type words: List[str]
:rtype: int
"""
from collections import defaultdict
dic = defaultdict(list)
ans = 0
for i,w in enumerate(words):
dic[w[0]].append((i,0))
for c in s:
l = dic[c]
dic[c] = []
for i,loc in l:
loc+=1
if loc == len(words[i]):
ans+=1
else:
dic[words[i][loc]].append((i,loc))
return ans
将所有数从小到大排列
对于nums[i]
作为最大值的贡献 即为i左侧的子序列个数 2^i
作为最小值的贡献 即为i右侧的子学列个数 2^(n-1-i)
nums[i]的贡献为 (2i-2(n-1-i))*nums[i]
def sumSubseqWidths(nums):
"""
:type nums: List[int]
:rtype: int
"""
MOD = 10**9+7
n = len(nums)
nums.sort()
l = [0]*n
base = 1
for i in range(n):
l[i] = base
base = (base*2)%MOD
ans = 0
for i in range(n):
num = nums[i]
ans = (ans+(l[i]*num)%MOD-(l[n-1-i]*num)%MOD)%MOD
return (MOD+ans)%MOD
依序遍历记录当前海拔 以及途径最高海拔
def largestAltitude(gain):
"""
:type gain: List[int]
:rtype: int
"""
cur,ans = 0,0
for v in gain:
cur +=v
ans = max(ans,cur)
return ans
将所有香槟倒满row=0
判断下一行 如果上一行邻近两个位置满了 则倒入此杯一半
def champagneTower(poured, query_row, query_glass):
"""
:type poured: int
:type query_row: int
:type query_glass: int
:rtype: float
"""
row = [poured]
for i in range(1,query_row+1):
tmp = [0]*(i+1)
for j ,v in enumerate(row):
if v>1:
tmp[j] += (v-1)/2
tmp[j+1] += (v-1)/2
row = tmp
return min(1,row[query_glass])