如何使大模型適配下游任務
阿新 • • 發佈:2021-12-20
滑動視窗是一種想象出來的資料結構:
- 左邊界
l
和右邊界r
l
往右滑意味著一個樣本出了視窗,r
往右滑意味著一個樣本進了視窗,l和r都只能往右滑
滑動內最大值和最小值的更新結構
視窗不管l
還是r
滑動之後,都會讓視窗呈現新狀況,如何能夠更快的得到視窗當前狀況下的最大值和最小值?最好平均下來複雜度能做到O(1)
利用單調雙端佇列
視窗本質:哪些數會依次成為最大數的優先順序
劍指 Offer 59 - I. 滑動視窗的最大值
給定一個數組 nums
和滑動視窗的大小 k
,請找出所有滑動窗口裡的最大值。
示例:
輸入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 輸出: [3,3,5,5,6,7] 解釋: 滑動視窗的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5 3] 6 7 5 1 3 -1 -3 [5 3 6] 7 6 1 3 -1 -3 5 [3 6 7] 7
class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(nums == null || k < 1 || nums.length < k) { return new int[0]; } LinkedList<Integer> qmax = new LinkedList<Integer>(); int[] res = new int[nums.length-k+1]; int index = 0; for (int i = 0; i < nums.length; i++) { while(!qmax.isEmpty() && nums[qmax.peekLast()]<=nums[i]) { qmax.pollLast(); } qmax.addLast(i); if(qmax.peekFirst() == i-k) { qmax.pollFirst(); } if(i >= k-1) { res[index++] = nums[qmax.peekFirst()]; } } return res; } }
求達標子陣列的數量
給定一個整型陣列arr
,和一個整數num
某個arr
中的子陣列sub
,如果想達標,必須滿足:
sub
中最大值 – sub
中最小值 <= num
,
返回arr
中達標子陣列的數量
public static int subArrayNum(int[] arr, int num) { if(arr == null || num < 0 || arr.length == 0) { return 0; } LinkedList<Integer> qmin = new LinkedList<Integer>(); LinkedList<Integer> qmax = new LinkedList<Integer>(); int l = 0; int r = 0; //[l...r) -> [0,0) 視窗內無數 int res = 0; while(l < arr.length) { while(r < arr.length) { while(!qmin.isEmpty() && arr[qmin.peekLast()] >= arr[r]) { qmin.pollLast(); } qmin.addLast(r); while(!qmax.isEmpty() && arr[qmax.peekLast()] <= arr[r]) { qmax.pollLast(); } qmax.addLast(r); if(arr[qmax.getFirst()] - arr[qmin.getFirst()] > num) { break; } r++; } res += r -l; if(qmin.peekFirst() == l) { qmin.pollFirst(); } if(qmax.peekFirst() == l) { qmax.pollFirst(); } l++; } return res; }
對於此題:
- 當前範圍內若達標,則縮小範圍必達標
- 若不達標,則擴大範圍必不達標,可以及時break
遇到題,先看看問題本身和範圍是否能夠建立單調性,然後選擇對應流程及流程中所要的資訊
每個人都有潛在的能量,只是很容易被習慣所掩蓋,被時間所迷離,被惰性所消磨~