Q1. 找出缺失的元素
签到题,排序之后一个一个找就行。
1 class Solution { 2 public: 3 vector<int> findMissingElements(vector<int>& nums) { 4 sort(nums.begin(),nums.end()); 5 vector<int> res; 6 for(int i=0;i<nums.size()-1;i++){ 7 for(int j=nums[i]+1;j<nums[i+1];j++){ 8 res.push_back(j); 9 } 10 } 11 return res; 12 } 13 };
给nums,能改一个元素(改成-1e5~1e5),获得三个元素的最大乘积。
排序之后,三种情况,最小的两个,最大的两个,或者首尾两端各一个。
class Solution: def maxProduct(self, nums: List[int]) -> int: nums.sort() a,b,c=nums[0]*nums[1],nums[-1]*nums[-2],nums[0]*nums[-1] print(a,b,c) res=0 res=max(res,abs(a)*100000) res=max(res,abs(b)*100000) res=max(res,abs(c)*100000) return res
两个无人机,分别要送di个物品,而且在ri倍数时不能送货,问完成送货任务的最少时间。
首先,时间越长越能完成任务,那么我们可以二分时间来求完成任务的最少时间。
那么给定时间t,我们如何判断在该时间内是否能完成任务呢?
第一台无人机在1~t能送货的时间为t - t // d1,同理,第二台t - t // d2.
此外,lcm(r1,r2)的倍数时间时,d1和d2都不能送货,我们同时需要保证d1+d2 <= t - t // lcm(r1,r2)。
如果有三个无人机,则需要加上三个判定条件。d2+d3 <= t - t // lcm(r2,r3),....,d1+d2+d3 <= t - t // lcm(r1,r2,r3)
1 class Solution: 2 def minimumTime(self, d: List[int], r: List[int]) -> int: 3 left,right=0,1 4 def check(t,d1,d2,r1,r2): 5 if d1>t-t//r1: 6 return False 7 if d2>t-t//r2: 8 return False 9 if d1+d2>t-t//lcm(r1,r2): 10 return False 11 return True 12 while not check(right,d[0],d[1],r[0],r[1]): 13 right<<=1 14 while left<right: 15 mid=left+right>>1 16 if check(mid,d[0],d[1],r[0],r[1]): 17 right=mid 18 else: 19 left=mid+1 20 return left
要求s的严格大于target的最小回文排列。
用回溯来写能清晰一点,和之前周赛的一个t4很像,之前是用循环来写的,这里循环非常不好写,所以浪费了好多时间去改。
每个i直接从target[i]开始枚举,保证大于等于target,如果填过一个大于target[i]的字母,那么后面的就能直接fill_min了。
1 class Solution { 2 public: 3 bool can_pal(int n,vector<int>& cnt){ 4 int odd=0; 5 for(int i=0;i<cnt.size();i++){ 6 if(cnt[i]%2) 7 odd++; 8 } 9 return n%2==0?odd==0:odd==1; 10 } 11 string lexPalindromicPermutation(string s, string target) { 12 vector<int> cnt(26,0); 13 int n=s.size(); 14 for(int i=0;i<s.size();i++){ 15 cnt[s[i]-'a']++; 16 } 17 if(!can_pal(n,cnt)) 18 return ""; 19 string ans(n,'?'); 20 auto fillmin=[&](int k,vector<int> cnt){ 21 int i=k,j=n-k-1; 22 while(i<j){ 23 int c=0; 24 while(c<26&&cnt[c]<2) 25 c++; 26 if(c==26) return false; 27 ans[i]=ans[j]=char(c+'a'); 28 cnt[c]-=2; 29 i++,j--; 30 } 31 if(i==j){ 32 int c=0; 33 while(c<26&&cnt[c]==0) 34 c++; 35 if(c==26) 36 return false; 37 ans[i]=char(c+'a'); 38 } 39 return true; 40 }; 41 function<bool(int)> dfs=[&](int i)->bool{ 42 int j=n-i-1; 43 if(i>j) return ans>target; 44 char st=target[i]; 45 for(char c=st;c<='z';c++){ 46 int need=(i==j?1:2); 47 int id=c-'a'; 48 if(cnt[id]<need) continue; 49 cnt[id]-=need; 50 ans[i]=ans[j]=c; 51 if(c==target[i]){ 52 if(dfs(i+1)) return true; 53 }else{ 54 string backans=ans; 55 if(fillmin(i+1,cnt)) return true; 56 ans=backans; 57 } 58 cnt[id]+=need; 59 } 60 ans[i]=ans[j]='?'; 61 return false; 62 }; 63 return dfs(0)?ans:""; 64 } 65 };
浙公网安备 33010602011771号