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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[Leetcode][第632题][JAVA][最小区间][堆][滑动窗口]

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leetcode][第632题][JAVA][最小区间][堆][滑动窗口] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【問題描述】[困難]

【解答思路】

1. 堆

復雜度

class Solution {public int[] smallestRange(List<List<Integer>> nums) {//區間的左邊和右邊int rangeLeft = 0, rangeRight = Integer.MAX_VALUE;//最小范圍int minRange = rangeRight - rangeLeft;//區間的左邊最大值int max = Integer.MIN_VALUE;int size = nums.size();//由于 k 個列表都是升序排列的,因此對每個列表維護一個指針,//通過指針得到列表中的元素,指針右移之后指向的元素一定大于或等于之前的元素。int[] next = new int[size];//使用最小堆維護 k 個指針指向的元素中的最小值PriorityQueue<Integer> priorityQueue = new PriorityQueue<Integer>(new Comparator<Integer>() {public int compare(Integer index1, Integer index2) {//第index個列表的next[index1]指針指向的元素return nums.get(index1).get(next[index1]) - nums.get(index2).get(next[index2]);}});for (int i = 0; i < size; i++) {//初始時,i 個指針都指向下標 0,因為next[i]=0priorityQueue.offer(i);//最大元素即為所有列表的下標 0 位置的元素中的最大值max = Math.max(max, nums.get(i).get(0));}while (true) {//每次從堆中取出最小值,minIndex是指第幾個列表,也代表指針數組next的下標int minIndex = priorityQueue.poll();//根據最大值和最小值計算當前區間int curRange = max - nums.get(minIndex).get(next[minIndex]);//如果當前區間小于最小區間則用當前區間更新最小區間if (curRange < minRange) {minRange = curRange;rangeLeft = nums.get(minIndex).get(next[minIndex]);rangeRight = max;}//然后將對應列表的指針右移next[minIndex]++;//如果一個列表的指針超出該列表的下標范圍,則說明該列表中的所有元素都被遍歷過,//堆中不會再有該列表中的元素,因此退出循環。if (next[minIndex] == nums.get(minIndex).size()) {break;}//將新元素加入堆中priorityQueue.offer(minIndex);//并更新堆中元素的最大值max = Math.max(max, nums.get(minIndex).get(next[minIndex]));}return new int[]{rangeLeft, rangeRight};} }
2. 滑動窗口+哈希表

復雜度

public int[] smallestRange(List<List<Integer>> nums) {int size = nums.size();Map<Integer, List<Integer>> indices = new HashMap<Integer, List<Integer>>();int xMin = Integer.MAX_VALUE, xMax = Integer.MIN_VALUE;for (int i = 0; i < size; i++) {for (int x : nums.get(i)) {//Map.getOrDefault(Object key, V defaultValue)方法的作用是://(1)當Map集合中存在這個key時,就使用這個key值,(若是數值型可以在此基礎上進行運算)//?(2)如果沒有就使用默認值defaultValue。List<Integer> list = indices.getOrDefault(x, new ArrayList<Integer>());list.add(i);indices.put(x, list);xMin = Math.min(xMin, x);xMax = Math.max(xMax, x);}}int[] freq = new int[size];int inside = 0;int left = xMin, right = xMin - 1;int bestLeft = xMin, bestRight = xMax;while (right < xMax) {right++;if (indices.containsKey(right)) {for (int x : indices.get(right)) {freq[x]++;if (freq[x] == 1) {inside++;}}while (inside == size) {if (right - left < bestRight - bestLeft) {bestLeft = left;bestRight = right;}if (indices.containsKey(left)) {for (int x: indices.get(left)) {freq[x]--;if (freq[x] == 0) {inside--;}}}left++;}}}return new int[]{bestLeft, bestRight};}

【總結】

1.滑動窗口核心思想
int left = 0, right = 0;while (right < s.size()) {`// 增大窗口window.add(s[right]);right++;while (window needs shrink) {// 縮小窗口window.remove(s[left]);left++;} }
2.Map-map.getOrDefault()用法

為什么要用?
Map中在每個數據上進行累加我必須先給每個key賦初值才行 (如果不賦初值在計算一開始就會報空指針異常)

API

解釋
Map.getOrDefault(Object key, V defaultValue)方法的作用是:
??(1)當Map集合中存在這個key時,就使用這個key值,(若是數值型可以在此基礎上進行運算)
??(2)如果沒有就使用默認值defaultValue

3.困難題目不在于思想的理解 而在于每句代碼的理解

轉載:https://leetcode-cn.com/problems/smallest-range-covering-elements-from-k-lists/solution/zui-xiao-qu-jian-by-leetcode-solution/
參考鏈接:https://blog.csdn.net/weixin_44325444/article/details/106306900?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

總結

以上是生活随笔為你收集整理的[Leetcode][第632题][JAVA][最小区间][堆][滑动窗口]的全部內容,希望文章能夠幫你解決所遇到的問題。

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