LeetCode 6367. 求出最多标记下标

文章介绍了两种方法解决找到数组中最多可以标记的下标数量的问题。一种是通过二分搜索,先对数组排序,然后在前半部分和后半部分之间寻找匹配。另一种是使用双指针,一个从数组开始,另一个从中间开始,根据匹配条件移动指针。两种方法都关注了元素的两倍关系和指针的单调性。
摘要由CSDN通过智能技术生成

6367. 求出最多标记下标

 

 

【二分】先对nums进行排序,二分解空间[0, n / 2],因为最多也就能匹配n / 2对。对于需要验证的答案m, 如果前m个元素和后m个元素能够满足nums[i] * 2 <= nums[j],那么就可以通过二分来尝试更大的m。

class Solution {

    // 44:44 二分

    int[] nums;
    int n;

    boolean check(int k) {
        for (int i = 0; i < k; i++) {
            if (nums[i] * 2 > nums[n - k + i]) return false;
        }
        return true;
    }

    public int maxNumOfMarkedIndices(int[] nums) {
        Arrays.sort(nums);
        this.nums = nums;
        this.n = nums.length;
        int l = 0, r = n / 2;
        while (l <= r) {
            int m = (l + r) >> 1;
            if (!check(m)) r = m - 1;
            else l = m + 1;
        }
        return r * 2;
    }
}

【双指针】通过上面的二分我们发现,前一半的元素肯定是去和后一半的元素进行比价的,假设前半部分也就是[0, n / 2]中第 i 个元素对应后半部分[n / 2, n - 1]中的第 j 个元素,那么第 i + 1 个元素肯定得匹配第 j 个元素后面的元素才行,这样一来 j 指针随着 i 指针单调变化,所以可以用双指针来解这道题。

class Solution {

    // 01: 01 双指针

    public int maxNumOfMarkedIndices(int[] nums) {
        Arrays.sort(nums);
        int n = nums.length, ans = 0;
        for (int i = 0, j = n / 2; i < n / 2; i++) {
            while (j < n && nums[j] < 2 * nums[i]) j++;
            if (j < n) {
                ans++;
                j++;
            }
        }
        return ans * 2;
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值