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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[Leedcode][JAVA][第56题][合并区间][数组][贪心算法]

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leedcode][JAVA][第56题][合并区间][数组][贪心算法] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【問題描述】56.合并區間

給出一個區間的集合,請合并所有重疊的區間。 示例 1: 輸入: [[1,3],[2,6],[8,10],[15,18]] 輸出: [[1,6],[8,10],[15,18]] 解釋: 區間 [1,3] 和 [2,6] 重疊, 將它們合并為 [1,6].

【解答思路】

1. 雙指針

左邊位置一定是確定,就是 a[0],而右邊位置是 max(a[1], b[1])
時間復雜度:O(N) 空間復雜度:O(1)

public int[][] merge(int[][] intervals) {List<int[]> res = new ArrayList<>();if (intervals == null || intervals.length == 0)return res.toArray(new int[0][]);// Arrays.sort(intervals, (a, b) -> a[0] - b[0]);// a[0] - b[0]大于0就交換順序// 根據二維數組第一個數字大小按每一行整體排序Arrays.sort(intervals, new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {// TODO Auto-generated method stubreturn o1[0] - o2[0];}});int i = 0;while (i < intervals.length) {int left = intervals[i][0];int right = intervals[i][1];// i不能到最后一行,所以要小于(數組的長度 - 1)// 判斷所在行的right和下一行的left大小,對right重新進行賦最大值,之后再不斷進行while循環判斷while (i < intervals.length - 1 && right >= intervals[i + 1][0]) {i++;right = Math.max(right, intervals[i][1]);}res.add(new int[] { left, right });i++;}return res.toArray(new int[0][]);}
2. 棧思想(威威)
  • 如果當前遍歷到的區間的左端點 > 結果集中最后一個區間的右端點,說明它們沒有交集,此時把區間添加到結果集;
  • 如果當前遍歷到的區間的左端點 <= 結果集中最后一個區間的右端點,說明它們有交集,此時產生合并操作,即:對結果集中最后一個區間的右端點更新(取兩個區間的最大值)。
    時間復雜度:O(N) 空間復雜度:O(1)
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Stack;public class Solution {public int[][] merge(int[][] intervals) {int len = intervals.length;if (len < 2) {return intervals;}// 按照起點排序Arrays.sort(intervals, Comparator.comparingInt(o -> o[0]));// 也可以使用 Stack,因為我們只關心結果集的最后一個區間List<int[]> res = new ArrayList<>();res.add(intervals[0]);for (int i = 1; i < len; i++) {int[] curInterval = intervals[i];// 每次新遍歷到的列表與當前結果集中的最后一個區間的末尾端點進行比較int[] peek = res.get(res.size() - 1);if (curInterval[0] > peek[1]) {res.add(curInterval);} else {// 注意,這里應該取最大peek[1] = Math.max(curInterval[1], peek[1]);}}return res.toArray(new int[res.size()][]);}public static void main(String[] args) {Solution solution = new Solution();int[][] intervals = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};int[][] res = solution.merge(intervals);for (int i = 0; i < res.length; i++) {System.out.println(Arrays.toString(res[i]));}} }

【總結】

1. Java 數組題 轉化 List
List<int[]> res = new ArrayList<>(); res.add(new int[] { left, right }); res.toArray(new int[0][]);
2. Java中Arrays.sort()的幾種用法
  • Arrays.sort(int[] a) 對一個數組的所有元素進行排序,并且是按從小到大的順序
  • Arrays.sort(int[] a, int fromIndex, int toIndex) 對數組部分排序,也就是對數組a的下標從fromIndex到toIndex-1的元素排序,注意:下標為toIndex的元素不參與排序
  • public static void sort(T[] a,int fromIndex, int toIndex, Comparator<? super T> c) Comparator類型的參數
Arrays.sort(intervals, new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {// TODO Auto-generated method stubreturn o1[0] - o2[0];}});
  • 區間類的問題,一般而言是需要畫圖思考的。
    • 和物理現象相關的
    • 本身問題描述就和圖形相關的問題
    • 鏈表問題
    • 回溯算法問題
    • 動態規劃問題
  • 貪心算法
    • 貪心算法(Greedy Algorithm)是指:在對問題求解時,總是做出在當前看來是最好的選擇。也就是不從整體最優上加以考慮,貪心算法所做出決策是在某種意義上的局部最優解。
    • 可以適用貪心的問題就是每一步局部最優,最后導致結果全局最優。
    • 必須具備無后效性,,即某個狀態以前的過程不會影響以后的狀態,只與當前狀態有關
    • 由于貪心算法適用的場景一般都是在一組決策里選擇最大或者最小值,因此常常在使用貪心算法之前,需要先對數據按照某種規則排序
    • 一旦貪心選擇性質不成立,可以考慮的另一種算法思想就是「動態規劃」。「動態規劃」在每一步做決策的時候,就不只考慮當前步驟的最優解。
    • 貪心算法應用
      • 對數據壓縮編碼的霍夫曼編碼(Huffman Coding)
      • 求最小生成樹的 Prim 算法和 Kruskal 算法
      • 求單源最短路徑的Dijkstra算法

    總結

    以上是生活随笔為你收集整理的[Leedcode][JAVA][第56题][合并区间][数组][贪心算法]的全部內容,希望文章能夠幫你解決所遇到的問題。

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