记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
目录
- 6/9 440. 字典序的第K小数字
- 6/10 3442. 奇偶频次间的最大差值 I
- 6/11 3445. 奇偶频次间的最大差值 II
- 6/12 3423. 循环数组中相邻元素的最大差值
- 6/13 2616. 最小化数对的最大差值
- 6/14 2566. 替换一个数字后的最大差值
- 6/15
6/9 440. 字典序的第K小数字
字典树思路
从小到大考虑
每个节点最多拥有10个子节点
例如节点1
在小于n的情况下
可以有第一层子节点10,11…19 最小值为110 最大值为110+9
可以有第二层子节点100,101,…199 最小值为1010 最大值为1910+9
记录每一层子节点最大最小值minv maxv
next_minv=10minv next_maxv = 10maxv+9
每一层节点个数为 min(maxv,n)-minv+1 最大值不能超过n
从最小前缀cur=1开始找起 统计1开头的所有数量num
如果需要的k大于等于num 则减去个数num 继续寻找下一个前缀2 cur = cur+1
如果k小于num 说明需要的数以1开头
进入1的第一层子节点继续寻找cur = cur*10 此时经过了节点1 所以k需要减去1
此时节点为10继续上述步骤 直至找到第k个
def findKthNumber(n, k):""":type n: int:type k: int:rtype: int"""def find(prefix,n):count,minv,maxv=0,prefix,prefixwhile minv<=n:count += min(maxv,n)-minv+1minv *=10maxv = maxv*10+9return countcur = 1k -=1while k>0:num = find(cur,n)if num<=k:k-=numcur+=1else:cur*=10k-=1return cur
6/10 3442. 奇偶频次间的最大差值 I
依次统计
def maxDifference(s):""":type s: str:rtype: int"""from collections import Counterc = Counter(s)odd = max(x for x in c.values() if x%2==1)even = min(x for x in c.values() if x%2==0)return odd-even
6/11 3445. 奇偶频次间的最大差值 II
字符只包含0~4 枚举各种字符之间的情况
https://leetcode.cn/problems/maximum-difference-between-even-and-odd-frequency-ii/solutions/3061845/mei-ju-qian-zhui-he-hua-dong-chuang-kou-6cwsm/?envType=daily-question&envId=2025-06-11
def maxDifference(s, k):""":type s: str:type k: int:rtype: int"""s=list(map(int,s))ans=float("-inf")for x in range(5):for y in range(5):if x==y:continuecurs=[0]*5pres=[0]*5mins=[[float("inf"),float("inf")],[float("inf"),float("inf")]]l=0for i,v in enumerate(s):curs[v]+=1r=i+1while r-l>=k and curs[x]>pres[x] and curs[y]>pres[y]:p,q=pres[x]&1,pres[y]&1mins[p][q]=min(mins[p][q],pres[x]-pres[y])pres[s[l]]+=1l+=1if r>=k:ans=max(ans,curs[x]-curs[y]-mins[curs[x]&1^1][curs[y]&1])return ans
6/12 3423. 循环数组中相邻元素的最大差值
遍历
def maxAdjacentDistance(nums):""":type nums: List[int]:rtype: int"""ans=float("-inf")n=len(nums)for i in range(n):ans = max(ans,abs(nums[i]-nums[(i+1)%n]))return ans
6/13 2616. 最小化数对的最大差值
将数组从小到大排列
dp[n]代表前n个数中满足条件的数对个数
二分
def minimizeMax(nums, p):""":type nums: List[int]:type p: int:rtype: int"""nums.sort()def find(mx):cnt=0i=0while i<len(nums)-1:if nums[i+1]-nums[i]<=mx:cnt+=1i+=2else:i+=1return cnt>=pl,r=0,nums[-1]-nums[0]while l<r:mid=(l+r)//2if find(mid):r=midelse:l=mid+1return l
6/14 2566. 替换一个数字后的最大差值
将最高位非9替换为9最大
将最高位非0替换为0最小
转换为字符串寻找
def minMaxDifference(num):""":type num: int:rtype: int"""s=str(num)pos=0mins=swhile pos<len(s) and s[pos]=='9':pos+=1if pos<len(s):s=s.replace(s[pos],'9')mins=mins.replace(mins[0], '0')return int(s)-int(mins)
6/15