[周赛第200场][Leetcode][第5477题][第5478题][JAVA][双指针][贪心]
生活随笔
收集整理的這篇文章主要介紹了
[周赛第200场][Leetcode][第5477题][第5478题][JAVA][双指针][贪心]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【問題描述】[中等]5477. 排布二進制網格的最少交換次數
【解答思路】
貪心
限制條件 第一行要求末尾的0要盡量多
時間復雜度: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往后走一位才可能相等
相等時,用兩個隊列的當前的和的最大值替換原來的值會懷疑這么寫不對,他明明是另一個隊列的最大值,并不是當前隊列的最大值,
這時你就可以想一下,我走過去另一條隊列,再走回來原隊列 其實是一樣的
時間復雜度: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][双指针][贪心]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对寄存器ESP和EBP的一些理解
- 下一篇: keeplive使用