LeetCode 第 18 场双周赛(188/587,前32%)
文章目錄
- 1. 比賽結果
- 2. 題目
- LeetCode 1331. 數(shù)組序號轉換 easy
- LeetCode 1328. 破壞回文串 medium
- LeetCode 1329. 將矩陣按對角線排序 medium
- LeetCode 1330. 翻轉子數(shù)組得到最大的數(shù)組值 hard
1. 比賽結果
做出來了1, 2, 3題,第4題提交超時
2. 題目
LeetCode 1331. 數(shù)組序號轉換 easy
題目鏈接
給你一個整數(shù)數(shù)組 arr ,請你將數(shù)組中的每個元素替換為它們排序后的序號。
序號代表了一個元素有多大。序號編號的規(guī)則如下:
- 序號從 1 開始編號。
- 一個元素越大,那么序號越大。如果兩個元素相等,那么它們的序號相同。
- 每個數(shù)字的序號都應該盡可能地小。
解答:
class Solution { public:vector<int> arrayRankTransform(vector<int>& arr) {multimap<int,int> m;for (int i = 0; i < arr.size(); ++i){m.insert(make_pair(arr[i],i));}int count = 0, prev = INT_MIN;for(auto it = m.begin(); it != m.end(); ++it){if(prev != it->first)//map有序,數(shù)值與前面的不相等,排名增加{count++;//排名prev = it->first;}arr[it->second] = count;//原來數(shù)的位置,寫成排名}return arr;} };LeetCode 1328. 破壞回文串 medium
題目鏈接
給你一個回文字符串 palindrome ,請你將其中 一個 字符用任意小寫英文字母替換,使得結果字符串的字典序最小,且 不是 回文串。
請你返回結果字符串。如果無法做到,則返回一個空串。
示例 1: 輸入:palindrome = "abccba" 輸出:"aaccba"示例 2: 輸入:palindrome = "a" 輸出:""提示: 1 <= palindrome.length <= 1000 palindrome 只包含小寫英文字母。解題:
class Solution { public:string breakPalindrome(string palindrome) {int i = 0, n = palindrome.size();if(n <= 1)return "";while(i < n && palindrome[i] <= 'a')i++;if(i == n)//全部為a{palindrome[n-1] = 'b';//最后一個改成breturn palindrome;}if(n%2==1 && i ==((n-1)/2))//奇數(shù)個字符,且找到的是中間的字符可以修改{i++;//去下一位找,修改中間的,還是回文串while(i < n && palindrome[i] <= 'a')i++;if(i == n){palindrome[n-1] = 'b';return palindrome;} }palindrome[i] = 'a';return palindrome;} };LeetCode 1329. 將矩陣按對角線排序 medium
題目鏈接
給你一個 m * n 的整數(shù)矩陣 mat ,請你將同一條對角線上的元素(從左上到右下)按升序排序后,返回排好序的矩陣。
示例:
解題:
class Solution { public:vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {int m = mat.size(), n = mat[0].size();int i = 0, x, y, k;vector<int> v;for( ; i < n; ++i){v.clear();//臨時存儲x = 0,y=i;//先把第一行開頭的遍歷掉while(x < m && y < n)//在范圍內{v.push_back(mat[x][y]);x++,y++;//對角線移動}sort(v.begin(),v.end());//排序x = 0, y = i, k =0;while(x < m && y < n){mat[x][y] = v[k];//寫回數(shù)組x++,y++,k++;}}for(i=1 ; i < m; ++i){v.clear();x = i,y=0;//第一列剩余的開頭的遍歷掉while(x < m && y < n){v.push_back(mat[x][y]);x++,y++;}sort(v.begin(),v.end());x = i, y = 0, k =0;while(x < m && y < n){mat[x][y] = v[k];x++,y++,k++;}}return mat;} };LeetCode 1330. 翻轉子數(shù)組得到最大的數(shù)組值 hard
題目鏈接
給你一個整數(shù)數(shù)組 nums 。「 數(shù)組值」定義為所有滿足 0 <= i < nums.length-1 的 |nums[i]-nums[i+1]| 的和。
你可以選擇給定數(shù)組的任意子數(shù)組,并將該子數(shù)組翻轉。但你只能執(zhí)行這個操作 一次 。
請你找到可行的最大 數(shù)組值 。
示例 1: 輸入:nums = [2,3,1,5,4] 輸出:10 解釋:通過翻轉子數(shù)組 [3,1,5] ,數(shù)組變成 [2,5,1,3,4] ,數(shù)組值為 10 。示例 2: 輸入:nums = [2,4,9,24,2,1,10] 輸出:68提示: 1 <= nums.length <= 3*10^4 -10^5 <= nums[i] <= 10^5解題:
超時代碼:(按照各種組合暴力求解,兩端的變化才會改變目標值)
class Solution { public:int maxValueAfterReverse(vector<int>& nums) {int i, j, n=nums.size(), val=0, maxval=INT_MIN, len;for(i = 0; i < n-1; i++)val += abs(nums[i]-nums[i+1]);for(len =2; len < n; ++len){for(i = 0; i+len < n; ++i){if(i == 0)maxval = max(maxval,val-abs(nums[i+len]-nums[i+len-1])+abs(nums[i+len]-nums[i]));else if(i+len == n)maxval = max(maxval,val-abs(nums[i]-nums[i-1])+abs(nums[i+len]-nums[i]));elsemaxval = max(maxval,val-abs(nums[i]-nums[i-1])-abs(nums[i+len]-nums[i+len-1])+abs(nums[i+len]-nums[i])+abs(nums[i+len-1]-nums[i-1]));}}return maxval;} };
參考別人的解法:
變化的值 = 增加的值 abs(a[l?1]?a[r])+abs(a[l]?a[r+1])abs(a[l?1]?a[r])+abs(a[l]?a[r+1])abs(a[l?1]?a[r])+abs(a[l]?a[r+1]) 減去原來的值 (abs(a[l]?a[l?1])+abs(a[r]?a[r+1]))(abs(a[l]?a[l?1])+abs(a[r]?a[r+1]))(abs(a[l]?a[l?1])+abs(a[r]?a[r+1]))
增加的值:abs(a[l?1]?a[r])+abs(a[l]?a[r+1])=max{a[l?1]+a[l]?(a[r]+a[r+1]),a[l?1]?a[l]?(a[r]?a[r+1]),?a[l?1]+a[l]?(?a[r]+a[r+1]),?a[l?1]?a[l]?(?a[r]?a[r+1])}abs(a[l?1]?a[r])+abs(a[l]?a[r+1]) =\\ max\{\\ a[l - 1] + a[l] - (a[r] + a[r+1]) ,\\ a[l - 1] - a[l] - (a[r] - a[r + 1]),\\ -a[l - 1] + a[l] - (-a[r] + a[r + 1]),\\ -a[l - 1] - a[l] - (-a[r] - a[r + 1])\\ \}abs(a[l?1]?a[r])+abs(a[l]?a[r+1])=max{a[l?1]+a[l]?(a[r]+a[r+1]),a[l?1]?a[l]?(a[r]?a[r+1]),?a[l?1]+a[l]?(?a[r]+a[r+1]),?a[l?1]?a[l]?(?a[r]?a[r+1])}
變化的值:
max{a[l?1]+a[l]?abs(a[l]?a[l?1])?(a[r]+a[r+1]+abs(a[r]?a[r+1])),a[l?1]?a[l]?abs(a[l]?a[l?1])?(a[r]?a[r+1]+abs(a[r]?a[r+1])),?a[l?1]+a[l]?abs(a[l]?a[l?1])?(?a[r]+a[r+1]+abs(a[r]?a[r+1])),?a[l?1]?a[l]?abs(a[l]?a[l?1])?(?a[r]?a[r+1]+abs(a[r]?a[r+1]))}max\{\\ a[l - 1] + a[l] - abs(a[l] - a[l - 1]) - (a[r] + a[r + 1] + abs(a[r] - a[r + 1])),\\ a[l - 1] - a[l] - abs(a[l] - a[l - 1]) - (a[r] - a[r + 1] + abs(a[r] - a[r + 1])),\\ -a[l - 1] + a[l] - abs(a[l] - a[l - 1]) - (-a[r] + a[r + 1] + abs(a[r] - a[r + 1])),\\ -a[l - 1] - a[l] - abs(a[l] - a[l - 1]) - (-a[r] - a[r + 1] + abs(a[r] - a[r + 1]))\\ \}max{a[l?1]+a[l]?abs(a[l]?a[l?1])?(a[r]+a[r+1]+abs(a[r]?a[r+1])),a[l?1]?a[l]?abs(a[l]?a[l?1])?(a[r]?a[r+1]+abs(a[r]?a[r+1])),?a[l?1]+a[l]?abs(a[l]?a[l?1])?(?a[r]+a[r+1]+abs(a[r]?a[r+1])),?a[l?1]?a[l]?abs(a[l]?a[l?1])?(?a[r]?a[r+1]+abs(a[r]?a[r+1]))}
一次遍歷 求得變化的值前面部分的最大值,后半部分的最小值,做差就是變化的最大值。
總結
以上是生活随笔為你收集整理的LeetCode 第 18 场双周赛(188/587,前32%)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 133. 克隆图(图的
- 下一篇: 程序员面试金典 - 面试题 16.04.