单调队列
| int *maxSlidingWindow(int *nums, int numsSize, int k, int *returnSize) { |
| *returnSize = numsSize - k + 1; |
| int *res = (int *) malloc(sizeof(int) * (*returnSize)); |
| |
| int dequeue[100001]; |
| int front = 0, rear = 0; |
| |
| |
| for (int i = 0; i < k - 1; ++i) { |
| |
| while (front < rear && nums[dequeue[rear - 1]] <= nums[i]) |
| rear--; |
| |
| dequeue[rear++] = i; |
| } |
| |
| for (int l = 0, r = k - 1; l < *returnSize; l++, r++) { |
| |
| while (front < rear && nums[dequeue[rear - 1]] <= nums[r]) |
| rear--; |
| |
| dequeue[rear++] = r; |
| |
| res[l] = nums[dequeue[front]]; |
| |
| if (dequeue[front] == l) front++; |
| } |
| return res; |
| } |
| int minDeque[100001]; |
| int maxDeque[100001]; |
| int maxFront, maxRear, minFront, minRear; |
| int *arr; |
| |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| int min(int a, int b) { |
| return a > b ? b : a; |
| } |
| |
| |
| bool ok(int limit, int number) { |
| |
| int MAX = maxFront < maxRear ? max(arr[maxDeque[maxFront]], number) : number; |
| int MIN = minFront < minRear ? min(arr[minDeque[minFront]], number) : number; |
| return MAX - MIN <= limit; |
| } |
| |
| void push(int r) { |
| |
| while (maxFront < maxRear && arr[maxDeque[maxRear - 1]] <= arr[r]) maxRear--; |
| |
| maxDeque[maxRear++] = r; |
| while (minFront < minRear && arr[minDeque[minRear - 1]] >= arr[r]) minRear--; |
| minDeque[minRear++] = r; |
| } |
| |
| void pop(int l) { |
| |
| if (maxFront < maxRear && maxDeque[maxFront] == l) maxFront++; |
| if (minFront < minRear && minDeque[minFront] == l) minFront++; |
| } |
| |
| int longestSubarray(int *nums, int numsSize, int limit) { |
| maxFront = 0, maxRear = 0, minFront = 0, minRear = 0; |
| arr = nums; |
| |
| int res = 0; |
| |
| for (int l = 0, r = 0; l < numsSize; ++l) { |
| while (r < numsSize && ok(limit, nums[r])) push(r++); |
| |
| res = max(res, r - l); |
| |
| pop(l); |
| } |
| return res; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| import java.io.*; |
| import java.util.Arrays; |
| |
| class Main { |
| |
| public static int MAXN = 100005; |
| |
| public static int[][] arr = new int[MAXN][2]; |
| |
| public static int n, d; |
| |
| public static int[] maxDeque = new int[MAXN]; |
| |
| public static int[] minDeque = new int[MAXN]; |
| |
| public static int maxh, maxt, minh, mint; |
| |
| public static void main(String[] args) throws IOException { |
| BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); |
| StreamTokenizer in = new StreamTokenizer(br); |
| PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); |
| while (in.nextToken() != StreamTokenizer.TT_EOF) { |
| n = (int) in.nval; |
| in.nextToken(); |
| d = (int) in.nval; |
| for (int i = 0; i < n; i++) { |
| in.nextToken(); |
| arr[i][0] = (int) in.nval; |
| in.nextToken(); |
| arr[i][1] = (int) in.nval; |
| } |
| int ans = compute(); |
| out.println(ans == Integer.MAX_VALUE ? -1 : ans); |
| } |
| out.flush(); |
| out.close(); |
| br.close(); |
| } |
| |
| public static int compute() { |
| |
| |
| Arrays.sort(arr, 0, n, (a, b) -> a[0] - b[0]); |
| maxh = maxt = minh = mint = 0; |
| int ans = Integer.MAX_VALUE; |
| for (int l = 0, r = 0; l < n; l++) { |
| |
| |
| while (!ok() && r < n) { |
| push(r++); |
| } |
| if (ok()) { |
| ans = Math.min(ans, arr[r - 1][0] - arr[l][0]); |
| } |
| pop(l); |
| } |
| return ans; |
| } |
| |
| |
| public static boolean ok() { |
| int max = maxh < maxt ? arr[maxDeque[maxh]][1] : 0; |
| int min = minh < mint ? arr[minDeque[minh]][1] : 0; |
| return max - min >= d; |
| } |
| |
| public static void push(int r) { |
| while (maxh < maxt && arr[maxDeque[maxt - 1]][1] <= arr[r][1]) { |
| maxt--; |
| } |
| maxDeque[maxt++] = r; |
| while (minh < mint && arr[minDeque[mint - 1]][1] >= arr[r][1]) { |
| mint--; |
| } |
| minDeque[mint++] = r; |
| } |
| |
| public static void pop(int l) { |
| if (maxh < maxt && maxDeque[maxh] == l) { |
| maxh++; |
| } |
| if (minh < mint && minDeque[minh] == l) { |
| minh++; |
| } |
| } |
| |
| } |
| int min(int a, int b) { |
| return a > b ? b : a; |
| } |
| |
| int shortestSubarray(int *nums, int numsSize, int k) { |
| int res = 0x7fffffff; |
| |
| int minDeque[100002]; |
| int front = 0, rear = 0; |
| |
| long long prefixSums[numsSize + 1]; |
| minDeque[rear++] = 0; |
| prefixSums[0] = 0; |
| for (int i = 1; i <= numsSize; ++i) { |
| |
| prefixSums[i] = prefixSums[i - 1] + nums[i - 1]; |
| |
| |
| |
| while (front < rear && prefixSums[minDeque[rear - 1]] >= prefixSums[i]) |
| rear--; |
| |
| minDeque[rear++] = i; |
| |
| |
| while (front + 1 < rear && prefixSums[i] - prefixSums[minDeque[front + 1]] >= k) |
| front++; |
| |
| |
| if (front < rear && prefixSums[i] - prefixSums[minDeque[front]] >= k) |
| res = min(res, i - minDeque[front]); |
| } |
| |
| return res == 0x7fffffff ? -1 : res; |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int findMaxValueOfEquation(int **points, int pointsSize, int *pointsColSize, int k) { |
| int maxDeque[100001][2]; |
| int front = 0, rear = 0; |
| |
| int res = 0x80000000; |
| for (int i = 0, x, y; i < pointsSize; ++i) { |
| |
| x = points[i][0]; |
| y = points[i][1]; |
| |
| while (front < rear && maxDeque[front][0] + k < x) front++; |
| |
| if (front < rear) res = max(res, x + y + maxDeque[front][1] - maxDeque[front][0]); |
| |
| while (front < rear && maxDeque[rear - 1][1] - maxDeque[rear - 1][0] <= y - x) rear--; |
| |
| maxDeque[rear][0] = x; |
| maxDeque[rear++][1] = y; |
| } |
| return res; |
| } |
| int *tasks; |
| int *workers; |
| int tasksSize; |
| int workersSize; |
| int deque[50001]; |
| int front, rear; |
| |
| int cmp(const void *a, const void *b) { |
| return *(int *) a - *(int *) b; |
| } |
| |
| int min(int a, int b) { |
| return a > b ? b : a; |
| } |
| |
| |
| |
| |
| bool f(int tl, int tr, int wl, int wr, int strength, int pills) { |
| front = 0; |
| rear = 0; |
| |
| int count = 0; |
| |
| for (int i = wl, j = tl; i <= wr; ++i) { |
| |
| while (j <= tr && tasks[j] <= workers[i]) |
| deque[rear++] = j++; |
| |
| if (front < rear && tasks[deque[front]] <= workers[i]) { |
| |
| front++; |
| } else { |
| |
| while (j <= tr && tasks[j] <= workers[i] + strength) |
| deque[rear++] = j++; |
| if (front < rear) { |
| |
| count++; |
| |
| rear--; |
| } else { |
| |
| return false; |
| } |
| } |
| } |
| |
| return count <= pills; |
| } |
| |
| int maxTaskAssign(int *task, int taskSize, int *worker, int workerSize, int pills, int strength) { |
| tasks = task; |
| workers = worker; |
| tasksSize = taskSize; |
| workersSize = workerSize; |
| |
| |
| qsort(tasks, tasksSize, sizeof(int), cmp); |
| qsort(workers, workersSize, sizeof(int), cmp); |
| |
| int left = 0, right = min(tasksSize, workersSize), mid; |
| |
| while (left <= right) { |
| mid = left + (right - left) / 2; |
| if (f(0, mid - 1, workersSize - mid, workersSize - 1, strength, pills)) |
| left = mid + 1; |
| else |
| right = mid - 1; |
| } |
| return right; |
| } |
本文作者:n1ce2cv
本文链接:https://www.cnblogs.com/sprinining/p/18013433
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步