记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
目录
- 7/8 724. 寻找数组的中心下标
- 7/9 3102. 最小化曼哈顿距离
- 7/10 2970. 统计移除递增子数组的数目 I
- 7/11 2972. 统计移除递增子数组的数目 II
- 7/12 2974. 最小数字游戏
- 7/13 3011. 判断一个数组是否可以变为有序
- 7/14 807. 保持城市天际线
7/8 724. 寻找数组的中心下标
从左到右依次判断
def pivotIndex(nums):
"""
:type nums: List[int]
:rtype: int
"""
s=sum(nums)
l,r=0,s
for i,num in enumerate(nums):
r-=num
if l==r:
return i
l+=num
return -1
7/9 3102. 最小化曼哈顿距离
找到当前最大距离
判断移除该距离两个点中一个后的距离变换
def minimumDistance(points):
"""
:type points: List[List[int]]
:rtype: int
"""
def check(arr,i):
n=len(arr)
if arr[0][1]==i:
return arr[n-1][0]-arr[1][0]
elif arr[-1][1]==i:
return arr[n-2][0]-arr[0][0]
else:
return arr[-1][0]-arr[0][0]
sx=[(x-y,i) for i,(x,y) in enumerate(points)]
sy=[(x+y,i) for i,(x,y) in enumerate(points)]
sx.sort()
sy.sort()
v1 = sx[-1][0]-sx[0][0]
v2 = sy[-1][0]-sy[0][0]
ans = float("inf")
if v1>=v2:
i,j = sx[0][1],sx[-1][1]
ans = min(ans,max(check(sx,i),check(sy,i)))
ans = min(ans,max(check(sx,j),check(sy,j)))
else:
i,j = sy[0][1],sy[-1][1]
ans = min(ans,max(check(sx,i),check(sy,i)))
ans = min(ans,max(check(sx,j),check(sy,j)))
return ans
7/10 2970. 统计移除递增子数组的数目 I
找到数组最长严格递增的位置i 即前缀nums[0]~nums[i]严格递增
如果i是数组最后的位置 那么所有子数组都可以移除即 n*(n+1)/2
否则 只保留前缀的一部分nums[0]~nums[i] 可以有i+2种
如果是前缀加后缀 设后缀第一个数为nums[j] 移除最后一个数是nums[j-1]
从后往前枚举j 直到nums[j]>=nums[j+1]
保持nums[i]<nums[j]
def incremovableSubarrayCount(nums):
"""
:type nums: List[int]
:rtype: int
"""
n=len(nums)
i = 0
while i<n-1 and nums[i]<nums[i+1]:
i+=1
if i==n-1:
return n*(n+1)//2
ans = i+2
j=n-1
while j==n-1 or nums[j]<nums[j+1]:
while i>=0 and nums[i]>=nums[j]:
i-=1
ans += i+2
j-=1
return ans
7/11 2972. 统计移除递增子数组的数目 II
与昨天的一样
找到数组最长严格递增的位置i 即前缀nums[0]~nums[i]严格递增
如果i是数组最后的位置 那么所有子数组都可以移除即 n*(n+1)/2
否则 只保留前缀的一部分nums[0]~nums[i] 可以有i+2种
如果是前缀加后缀 设后缀第一个数为nums[j] 移除最后一个数是nums[j-1]
从后往前枚举j 直到nums[j]>=nums[j+1]
保持nums[i]<nums[j]
def incremovableSubarrayCount(nums):
"""
:type nums: List[int]
:rtype: int
"""
n=len(nums)
i = 0
while i<n-1 and nums[i]<nums[i+1]:
i+=1
if i==n-1:
return n*(n+1)//2
ans = i+2
j=n-1
while j==n-1 or nums[j]<nums[j+1]:
while i>=0 and nums[i]>=nums[j]:
i-=1
ans += i+2
j-=1
return ans
7/12 2974. 最小数字游戏
依照规则 从小到大排序 奇数偶数位的数值调换
def numberGame(nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
nums.sort()
i = 0
while i<len(nums):
nums[i],nums[i+1]=nums[i+1],nums[i]
i+=2
return nums
7/13 3011. 判断一个数组是否可以变为有序
二进制1的个数相同的连续数值可以分为一组
每一组内必定可以实现有序
从头遍历 为了实现全部数组有序
排在后面小组的所有数值 必定需要大于前面小组的最大值
pmx记录前面小组的最大值 mx记录当前小组最大值
def canSortArray(nums):
"""
:type nums: List[int]
:rtype: bool
"""
n=len(nums)
pmx = 0
i = 0
while i<n:
mx = 0
cnt = nums[i].bit_count()
while i<n and nums[i].bit_counb()==cnt:
x = nums[i]
if x<pmx:
return False
mx=max(mx,x)
i+=1
pmx=mx
return True
7/14 807. 保持城市天际线
找出每一行 每一列的最大高度
对于位置i,j 最大高度为min(第i行的max,第j列的max)
def maxIncreaseKeepingSkyline(grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
n,m = len(grid),len(grid[0])
col,row = [0]*m,[0]*n
for i in range(n):
for j in range(m):
row[i] = max(row[i],grid[i][j])
col[j] = max(col[j],grid[i][j])
ans = 0
for i in range(n):
for j in range(m):
new = min(row[i],col[j])
ans += new-grid[i][j]
return ans