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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[周赛第200场][Leetcode][第5477题][第5478题][JAVA][双指针][贪心]

發布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [周赛第200场][Leetcode][第5477题][第5478题][JAVA][双指针][贪心] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【問題描述】[中等]5477. 排布二進制網格的最少交換次數

【解答思路】

貪心

限制條件 第一行要求末尾的0要盡量多

  • 計算每行最后有幾個0
  • 遍歷交互 符合條件 第i行的末尾0的數量為n-i-1 統計交換次數
  • 第i行的末尾0的數量小于n-i-1,不符合條件
  • 時間復雜度:O(N^2) 空間復雜度:O(N)

    class Solution {public int minSwaps(int[][] grid) {int n = grid.length;int res = 0;int sum;int[] cnt = new int[n];//計算末尾0的數量for(int i=0;i<n;i++){sum=0;for(int j=n-1;j>=0;j--){if(grid[i][j]==0) sum++;else break;}cnt[i]=sum;}for(int i=0;i<n;i++){if(cnt[i]<n-i-1){for(int j=i+1;j<n;j++){//只要滿足條件就可以交換一次,停止了//這里因為cnt[i],i越小,cnt[i]會越大if(cnt[j]>=n-i-1){res+=swap(cnt,i,j);break;}}}}//第i行的末尾0的數量小于n-i-1,不符合條件for(int i=0;i<n;i++){if(cnt[i]<n-1-i) return -1;}return res;}// 由j到i 依次向上交換 并統計次數private int swap(int[] num,int i,int j){int count = 0;while(j>i){int temp = num[j-1];num[j-1] = num[j];num[j]=temp;j--;count++;}return count;} }

    【問題描述】[困難]5478. 最大得分

    【解答思路】

    雙指針

    求兩個隊列相等時可以切換的最大值
    雙指針模擬a、b隊列當前的和

  • 如果a隊列的當前值>b隊列的當前值,那么b隊列的最大值只能+b隊列的當前值了,
    因為本身a>b了,后面會越差越大的,因為他是有序的,把b往后走一位才可能相等
  • 如果a隊列的當前值 < b隊列的當前值,那么a隊列的最大值只能+a隊列的當前值了
  • 如果相等了,就用兩個隊列的當前的和的最大值替換原來的值,再加上當前值
    相等時,用兩個隊列的當前的和的最大值替換原來的值會懷疑這么寫不對,他明明是另一個隊列的最大值,并不是當前隊列的最大值,
    這時你就可以想一下,我走過去另一條隊列,再走回來原隊列 其實是一樣的
  • 時間復雜度:O(N) 空間復雜度:O(1)

    class Solution {public int maxSum(int[] nums1, int[] nums2) {int MOD =1000000007;//兩個數列的最大值long ans1 = 0, ans2 = 0;//兩個數列的下標int i = 0, j = 0;//如果有一個到頭了,就不能再用了while (i < nums1.length && j < nums2.length) {//如果num2[j]大了,就不能切換數組了(畢竟是有序數組,后面會越差越多)if (nums1[i] < nums2[j]) {ans1 += nums1[i];i++;//反之,num[i]大了,也一樣} else if (nums1[i] > nums2[j]) {ans2 += nums2[j];j++;} else {//如果兩個值一樣了,就選擇最大的那個把兩個隊列的值替換掉,還要加上當前的值ans1 = Math.max(ans1, ans2) + nums1[i];ans2 = ans1;i++;j++;} }//把第一個序列的或者第二個序列的未完成的完成了while (i < nums1.length) {ans1 += nums1[i];i++;}while (j < nums2.length) {ans2 += nums2[j];j++;}return (int) (Math.max(ans1, ans2) % MOD);}}

    【總結】

    1. 數組題目不要太過于死板, 要找到特殊的限制條件 用局部的思想代替全局,如5477題目中用末尾0的個數進行統計、用統計的cnt數組計算交換次數
    2.有序 雙指針是個好東西 找到突破點 困難題目也不難了

    參考鏈接:https://blog.csdn.net/weixin_46285416/article/details/107744218

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的[周赛第200场][Leetcode][第5477题][第5478题][JAVA][双指针][贪心]的全部內容,希望文章能夠幫你解決所遇到的問題。

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