LeetCode 热题 HOT 100 -------31. 下一个排列(数组,数学问题)128. 最长连续序列(数组) 11. 盛最多水的容器(数组) 621. 任务调度器 (数组)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 热题 HOT 100 -------31. 下一个排列(数组,数学问题)128. 最长连续序列(数组) 11. 盛最多水的容器(数组) 621. 任务调度器 (数组)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
dsadas
/**思路:找下一個排列,并且盡可能小,所以我們應該找一序列中從左邊開始的“較小值”與“較大值”交換,但是為了盡可能小應該滿足: 1、“較小值”:應該盡可能靠右,并且“較小值”的右邊子序列升序 2、“較大值”:這個較大值應該是“較小值”右邊所有比他大的序列中的最小值 3、調換后,然后保證"較小值i處"右邊是升序的 (此時i右邊的數組是遞減的) 4、注意:如果整個數組是遞減的,則為該數組的最大值123456 123465 123546 ... 654321*/ class Solution {public void nextPermutation(int[] nums) {if(nums.length == 1) return ; //首先找"較小值,該值是從右向左遍歷的"較小值" int i = nums.length-2 ;while(i>=0 && nums[i] >= nums[i+1]){ i--;} //此時i+1開始的數組是遞減的,若i為-1,說明數組是最大排序,則只有在i>=0的時候我們才能進行判斷int j = nums.length-1;if(i>=0){//找盡可能靠右邊的大于"較小值"的最小的"較大值" (其實就是數組最后一個值)while(j>=0 && nums[i]>= nums[j]){j--;}//到此,"較小值" 和 "較大值" 就已經找到位置了,然后需要調換順序int temp = nums[i];nums[i] = nums[j];nums[j] = temp;//這時候我們就要保證“較小值”右邊是生效的,在這之前,[i+1,nums.length-1]是遞減的,應該變換反轉方向//Arrays.sort(nums , i+1 , nums.length);//當i=-1,說明此時數組是最大值,返回的是最小的數組排序,也可以表達為Arrays.sort(nums , i+1 , nums.length);//因此放到外面}Arrays.sort(nums , i+1 , nums.length);} }//換一種寫法 class Solution {public void nextPermutation(int[] nums) {int len = nums.length;for(int i=len-1 ; i>0 ; i--){if(nums[i]>nums[i-1]){Arrays.sort(nums,i,len); //"i-1"為較小值,此時我們先將"i-1"右邊的數組排序for(int j=i ; j<len ; j++){if(nums[j] > nums[i-1]){int temp = nums[j];nums[j] = nums[i-1];nums[i-1] = temp;return;}}}}Arrays.sort(nums); //為了對應數組的最大序返回的數組return ;} } //解法3:(和解法1差不多) class Solution {public void nextPermutation(int[] nums) {//首先我們去找“較小值”int i = nums.length-2;while(i>=0 && nums[i]>=nums[i+1]){i--;}//此時找到了“最靠右邊”的“較小值”,然后我們去找"盡可能小的"“較大值”,也就是在“較小值”的//右邊序列中僅大于“較小值”的最大值int j = nums.length-1;//如果i<0,也就是-1,則說明這個數組正好是降序的,也就是這個數組可以表示的最大值//所以我們在i>=0,的時候我們才進行交換if(i>=0){while(j>=0 && nums[i]>=nums[j]){j--;}//此時就找到了我們想要的“較大值”的位置,然后讓兩個值交換// 為了低耦合,我們用方法進行“交換”swap(nums,i,j);}//這時候我們就要保證“較小值”右邊是生效的,在這之前,[i+1,nums.length-1]是遞減的,應該變換反轉方向reverse(nums,i+1);}public void swap(int[] nums , int i , int j){int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}public void reverse(int[] nums , int start){int l = start , r = nums.length-1;while(l < r){swap(nums,l,r);l++;r--;}} }dasdasd
//思路:如果不考慮時間復雜度0(n),可以先排序,然后滑動窗口。 //因為考慮時間復雜度,所以要換一種數學思想:“核心思想”:我們只要去找一個連續的當中得最小值開始求就可以,通過num,num-1判定 //1、優化:因為我們找連續的,所以可以通過set來去掉重復的數 //2、遍歷數組,我們沒必要每個數都找連續,如果當前數值-1不在set中,我們再去求連續,如果在則不用了 class Solution {public int longestConsecutive(int[] nums) {//創建setSet<Integer> nums_set = new HashSet<Integer>();//將數組放入到set中for(int num : nums){nums_set.add(num);}int longestCount = 0;//遍歷數組,看num-1是否在set中,如果在,就沒必要去就最大連續,如果不在,就可以去求最大連續for(int num : nums){if(!nums_set.contains(num-1)){//說明不包含num-1,則num是某個連續序列得最小值int curNum = num;int curCount = 1;//求“num是某個連續序列得最小值”的連續序列得長度while(nums_set.contains(curNum+1)){curNum+=1;curCount += 1;}longestCount = Math.max(longestCount,curCount);}}return longestCount;} }dasdas
//第一種方法,雙重for循環,我記得會超時,所以不再寫 /* 通過左右指針判斷,通過一個變量存儲水的面記 areaMax = Integer.MIN_VALUE 然后做右指針記錄數值,往里面遍歷,如果高變大了我們重新求面積,如果沒有變大,則直接略過 時間復雜度O(n) 空間復雜度O(1) */ class Solution {public int maxArea(int[] height) {int l = 0 , r = height.length-1;int maxArea = (r-l) * Math.min(height[l] , height[r]);while(l<r){if(height[l]<height[r]){l++;}else{r--;}maxArea = Math.max(maxArea , (r-l)*Math.min(height[l],height[r]));}return maxArea;} }//優化算法 class Solution {public int maxArea(int[] height) {int l = 0 , r = height.length-1 , maxArea = 0;while(l<r){maxArea = height[l] > height[r] ? Math.max(maxArea , (r-l)*height[r--]) : Math.max(maxArea , (r-l)*height[l++]);}return maxArea;} }dasdads
//解題思路:“桶思想”:很奇妙的思想 //1、我們找幾個桶子,大小是數組中最大重復字數的個數 //2、每個桶的容量是(n+1),這樣可以保證每個桶都是不需要待命的,因此這種情況的全部時間就是(桶數-1)*(間隔數+1)+最后一個桶的任務個數 //3、第二種情況就是不需要待命,則總時間就是"tasks.length()""class Solution {public int leastInterval(char[] tasks, int n) {//求一下數組的長度int len = tasks.length;//求一下最大個數的任務是什么,相同個數的任務有多少int maxTask = 0 , maxCountTask = 0;//創建放任務的數組,一共26個字母int[] temp = new int[26];//往里面存入數據for(char c : tasks){temp[c-'A']++; //存入數據maxTask = Math.max(maxTask,temp[c-'A']);}for(int countTask : temp){if(countTask == maxTask){maxCountTask++;}}return Math.max(len,(maxTask-1)*(n+1)+maxCountTask);} }總結
以上是生活随笔為你收集整理的LeetCode 热题 HOT 100 -------31. 下一个排列(数组,数学问题)128. 最长连续序列(数组) 11. 盛最多水的容器(数组) 621. 任务调度器 (数组)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 值得您收藏的png图标第二辑
- 下一篇: 计算机基础实训项目二 Word 综合应用