日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 第 18 场双周赛(188/587,前32%)

發布時間:2024/7/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 第 18 场双周赛(188/587,前32%) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 比賽結果
    • 2. 題目
      • LeetCode 1331. 數組序號轉換 easy
      • LeetCode 1328. 破壞回文串 medium
      • LeetCode 1329. 將矩陣按對角線排序 medium
      • LeetCode 1330. 翻轉子數組得到最大的數組值 hard

1. 比賽結果

做出來了1, 2, 3題,第4題提交超時

2. 題目

LeetCode 1331. 數組序號轉換 easy

題目鏈接
給你一個整數數組 arr ,請你將數組中的每個元素替換為它們排序后的序號。

序號代表了一個元素有多大。序號編號的規則如下:

  • 序號從 1 開始編號。
  • 一個元素越大,那么序號越大。如果兩個元素相等,那么它們的序號相同。
  • 每個數字的序號都應該盡可能地小。
示例 1: 輸入:arr = [40,10,20,30] 輸出:[4,1,2,3] 解釋:40 是最大的元素。 10 是最小的元素。 20 是第二小的數字。 30 是第三小的數字。示例 2: 輸入:arr = [100,100,100] 輸出:[1,1,1] 解釋:所有元素有相同的序號。示例 3: 輸入:arr = [37,12,28,9,100,56,80,5,12] 輸出:[5,3,4,2,8,6,7,1,3]提示: 0 <= arr.length <= 10^5 -10^9 <= arr[i] <= 10^9

解答:

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有序,數值與前面的不相等,排名增加{count++;//排名prev = it->first;}arr[it->second] = count;//原來數的位置,寫成排名}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))//奇數個字符,且找到的是中間的字符可以修改{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 的整數矩陣 mat ,請你將同一條對角線上的元素(從左上到右下)按升序排序后,返回排好序的矩陣。

示例:

輸入:mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]] 輸出:[[1,1,1,1],[1,2,2,2],[1,2,3,3]]提示: m == mat.length n == mat[i].length 1 <= m, n <= 100 1 <= mat[i][j] <= 100

解題:

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];//寫回數組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. 翻轉子數組得到最大的數組值 hard

題目鏈接

給你一個整數數組 nums 。「 數組值」定義為所有滿足 0 <= i < nums.length-1 的 |nums[i]-nums[i+1]| 的和。

你可以選擇給定數組的任意子數組,并將該子數組翻轉。但你只能執行這個操作 一次

請你找到可行的最大 數組值 。

示例 1: 輸入:nums = [2,3,1,5,4] 輸出:10 解釋:通過翻轉子數組 [3,1,5] ,數組變成 [2,5,1,3,4] ,數組值為 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]))}
一次遍歷 求得變化的值前面部分的最大值,后半部分的最小值,做差就是變化的最大值。

class Solution { public:int maxValueAfterReverse(vector<int>& nums) {int i, j, n = nums.size(), val = 0, maxval = 0;for(i = 0; i < n-1; i++)val += abs(nums[i]-nums[i+1]);if(n <= 2)return val;maxval = val;for(i = 0; i < n; ++i){if(i != n-1)maxval = max(maxval, val+abs(nums[0]-nums[i+1])-abs(nums[i]-nums[i+1]));//左邊界0if(i != 0)maxval = max(maxval, val+abs(nums[i-1]-nums[n-1])-abs(nums[i]-nums[i-1]));//右邊界n-1}int max1 = INT_MIN, min1 = INT_MAX;int max2 = INT_MIN, min2 = INT_MAX;int max3 = INT_MIN, min3 = INT_MAX;int max4 = INT_MIN, min4 = INT_MAX;for(i = 1; i < n; ++i){max1 = max(max1, nums[i-1]+nums[i]-abs(nums[i]-nums[i-1]));max2 = max(max2, nums[i-1]-nums[i]-abs(nums[i]-nums[i-1]));max3 = max(max3, -nums[i-1]+nums[i]-abs(nums[i]-nums[i-1]));max4 = max(max4, -nums[i-1]-nums[i]-abs(nums[i]-nums[i-1]));min1 = min(min1, nums[i-1]+nums[i]+abs(nums[i]-nums[i-1]));min2 = min(min2, nums[i-1]-nums[i]+abs(nums[i]-nums[i-1]));min3 = min(min3, -nums[i-1]+nums[i]+abs(nums[i]-nums[i-1]));min4 = min(min4, -nums[i-1]-nums[i]+abs(nums[i]-nums[i-1]));}int maxdiff = max(INT_MIN, max(max1-min1, max(max2-min2, max(max3-min3, max4-min4))));maxval = max(maxval, val+maxdiff);return maxval;} };

總結

以上是生活随笔為你收集整理的LeetCode 第 18 场双周赛(188/587,前32%)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。