記錄了初步解題思路 以及本地實現代碼;并不一定為最優 也希望大家能一起探討 一起進步
目錄
- 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