LeetCode——三指针

2367. 等差三元组的数目


思路

对于i来言,从左到右遍历,数是递增的。也就是找到下一个数numj - numsi == diff以及numsk - numsi == 2 * diff。简化成双指针,随着i的增加,每次调整j、k使之满足条件即可
代码

java 复制代码
class Solution {
    public int arithmeticTriplets(int[] nums, int diff) {
        int n = nums.length, ans = 0, i = 0, j = 0;
        for (int num : nums) {
            while (i < n && num + diff > nums[i]) { // 找到>=的数
                i ++;
            }
            if (i >= n || num + diff < nums[i]) continue;
            while (j < n && num + 2 * diff > nums[j]) {
                j ++;
            }
            if (j < n && num + 2 * diff == nums[j]) {
                ans ++;
            }
        }
        return ans;
    }
}

2563. 统计公平数对的数目


思路

数对而言,没有相应顺序要求,因此不妨给数组进行排序。对于lower <= numsi + numsj <= upper。可以拆解为

  • numsi + numsj >= lower
  • numsi + numsj <= upper两段
    numsi是递增的,因此可以从后往前找到第一个lj满足numsi + numslj >= lower,以及找到第一个rj满足numsi + numsrj > upper.计数rj - lj;
    代码
java 复制代码
class Solution {
    public long countFairPairs(int[] nums, int lower, int upper) {
        Arrays.sort(nums);
        long ans = 0;
        int lj = nums.length, rj = nums.length, n = nums.length;
        for (int i = 0; i < n; i ++) { // 递增
            while (rj > 0 && nums[rj - 1] > upper - nums[i]) rj --; // 递减
            while (lj > 0 && nums[lj - 1] >= lower - nums[i]) lj --; // 递减
            ans += Math.min(rj, i) - Math.min(lj, i);
        }
        return ans;
    }
}

以上是可以转换成双指针的做法,下面这种则是通过一次遍历维护某种性质的做法

795. 区间子数组个数


思路

枚举子数组的右边界,需要确定左边界的范围。左边界应该是numsl刚好大于right,numsr大于等于left.

代码

java 复制代码
class Solution {
    public int numSubarrayBoundedMax(int[] nums, int left, int right) {
        int n = nums.length, ans = 0, l = -1, r = -1;
        for (int i = 0; i < n; i ++) { // 表示以i为右端点的子数组
            if (nums[i] > right) l = i; // 保证不能存在大于right的存在,右边界
            if (nums[i] >= left) r = i; // 记录其中最近的>= left的数存在,左边界
            ans += (r - l);
        }
        return ans;
    }
}

2444. 统计定界子数组的数目


思路

枚举子数组的右边界,右边界位于最近位于上一个不在minK, maxK区间值的索引i0,与min(minIndex, maxIndex)之间
代码

java 复制代码
class Solution {
    public long countSubarrays(int[] nums, int minK, int maxK) {
        int n = nums.length, minIndex = -1, maxIndex = -1, i0 = -1;
        long ans = 0;
        for (int i = 0; i < n; i ++) {
            if (nums[i] < minK || nums[i] > maxK) i0 = i;
            if (nums[i] == minK) minIndex = i;
            if (nums[i] == maxK) maxIndex = i;
            ans += Math.max(Math.min(minIndex, maxIndex) - i0, 0);
        }
        return ans;
    }
}
相关推荐
sel_96 分钟前
【Pytorch】PyTorch 深度学习框架详解:从安装到实战
人工智能·pytorch·深度学习·算法·语言模型
学习星球8 分钟前
【LeetCode算法题精讲】图算法精讲——从图遍历到拓扑排序
数据结构·算法·leetcode·图搜索
_Narcissus_16 分钟前
常见数论算法笔记
数据结构·c++·算法·高精度·数论·快速幂·质数筛
CVHub32 分钟前
智能标注工具 X-AnyLabeling v4 全面升级:迈向 AI 时代的数据生产基础设施
人工智能·算法·github
octopus_c3 小时前
数据结构:堆(Heap)详解
c语言·数据结构·算法
YH55269849 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
遥感知识服务11 小时前
从局部阈值、双极化到暗地表剔除:NASA OPERA DSWx-S1全球动态水体算法拆解
大数据·人工智能·深度学习·神经网络·算法·机器学习
晚风醉蝶11 小时前
1-13-TimSort
算法
ZJU_统一阿萨姆11 小时前
【算子开发】算子融合与Softmax_LayerNorm实现
人工智能·算法·语言模型·硬件架构
叩码以求索13 小时前
浅谈:前序遍历反转法求解N叉树的后序遍历
算法