Weekly Contest 474 3731. Find Missing Elements - Easy 給定 nums 陣列,找出裡面最小和最大的值之間缺少的所有整數。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Solution {public : std::vector<int > findMissingElements (std::vector<int >& nums) { int min_val = *min_element (nums.begin (), nums.end ()); int max_val = *max_element (nums.begin (), nums.end ()); unordered_set<int > nums_set (nums.begin(), nums.end()) ; vector<int > missing; for (int i = min_val + 1 ; i < max_val; ++i) { if (nums_set.find (i) == nums_set.end ()) missing.push_back (i); } return missing; } };
3732. Maximum Product of Three Elements After One Replacement - Medium 給定 nums 陣列,可以用 [$-10^5, 10^5$] 範圍內的任意整數替換陣列中的一個元素,求替換後三個元素乘積的最大值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution {public : long long maxProduct (std::vector<int >& nums) { using ll = long long ; int n = nums.size (); sort (nums.begin (), nums.end ()); ll s1 = nums[0 ]; ll s2 = nums[1 ]; ll l1 = nums[n - 1 ]; ll l2 = nums[n - 2 ]; const ll R = 100000LL ; ll prod1 = max (s1 * s2, l1 * l2) * R; ll prod2 = (s1 * l1) * (-R); return max ({prod1, prod2}); } };
3733. Minimum Time to Complete All Deliveries - Medium 給定兩個無人機, 分別需要完成 d[0] 和 d[1] 個任務,兩台分別每 r[0] 和 r[1] 小時需要充電一次,且兩者不能同時工作,求完成所有任務的最少時間。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 class Solution {public : long long gcd (long long a, long long b) { while (b){ a %= b; swap (a, b); } return a; } long long lcm (long long a, long long b) { if (a == 0 || b == 0 ) return 0 ; return a / gcd (a, b) * b; } bool valid (long long t, vector<long long >& lld, vector<long long >& llr, long long rlcm) { long long r0 = t / llr[0 ]; long long r1 = t / llr[1 ]; long long r_both = t / rlcm; long long slot0 = r1 - r_both; long long slot1 = r0 - r_both; long long slot_both = t - r0 - r1 + r_both; long long remaining0 = max (lld[0 ] - slot0, (long long ) 0 ); long long remaining1 = max (lld[1 ] - slot1, (long long ) 0 ); return (remaining0 + remaining1) <= slot_both; } long long minimumTime (vector<int >& d, vector<int >& r) { vector<long long > lld (d.begin(), d.end()) ; vector<long long > llr (r.begin(), r.end()) ; long long left = d[0 ] + d[1 ]; long long right = 2 * left; long long ans = right; long long rlcm = lcm (llr[0 ], llr[1 ]); while (left <= right){ long long m = left + (right - left) / 2 ; if (valid (m, lld, llr, rlcm)){ right = m - 1 ; ans = m; }else left = m + 1 ; } return ans; } };
3734. Lexicographically Smallest Palindromic Permutation Greater Than Target 給定一個字串 s 和 target,找出 s 的所有回文排列中,比 target 字典序更大的最小回文排列,若無則回傳空字串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 class Solution {public : string lexPalindromicPermutation (string s, string target) { int left[26 ]{}; for (char b : s) { left[b - 'a' ]++; } auto valid = [&]() -> bool { for (int c : left) { if (c < 0 ) { return false ; } } return true ; }; string mid_ch; for (int i = 0 ; i < 26 ; i++) { int c = left[i]; if (c % 2 == 0 ) { continue ; } if (!mid_ch.empty ()) { return "" ; } mid_ch = 'a' + i; left[i]--; } int n = s.size (); for (int i = 0 ; i < n / 2 ; i++) { left[target[i] - 'a' ] -= 2 ; } if (valid ()) { string right_s = target.substr (0 , n / 2 ); ranges::reverse (right_s); right_s = mid_ch + right_s; if (right_s > target.substr (n / 2 )) { return target.substr (0 , n / 2 ) + right_s; } } for (int i = n / 2 - 1 ; i >= 0 ; i--) { int b = target[i] - 'a' ; left[b] += 2 ; if (!valid ()) { continue ; } for (int j = b + 1 ; j < 26 ; j++) { if (left[j] == 0 ) { continue ; } left[j] -= 2 ; target.resize (i + 1 ); target[i] = 'a' + j; for (int k = 0 ; k < 26 ; k++) { target += string (left[k] / 2 , 'a' + k); } string right_s = target; ranges::reverse (right_s); target += mid_ch; target += right_s; return target; } } return "" ; } };