1. 程式人生 > 其它 >如何使大模型適配下游任務

如何使大模型適配下游任務

滑動視窗是一種想象出來的資料結構:

  1. 左邊界l和右邊界r
  2. 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;
	}

對於此題:

  1. 當前範圍內若達標,則縮小範圍必達標
  2. 若不達標,則擴大範圍必不達標,可以及時break

遇到題,先看看問題本身和範圍是否能夠建立單調性,然後選擇對應流程及流程中所要的資訊

每個人都有潛在的能量,只是很容易被習慣所掩蓋,被時間所迷離,被惰性所消磨~