首页 > 其他分享 >【每日一题】LeetCode 2576.求出最多标记下标(贪心、数组、双指针、二分查找、排序)

【每日一题】LeetCode 2576.求出最多标记下标(贪心、数组、双指针、二分查找、排序)

时间:2024-09-12 16:20:19浏览次数:3  
标签:下标 标记 2576 nums int 数组 操作 LeetCode

【每日一题】LeetCode 2576.求出最多标记下标(贪心、数组、双指针、二分查找、排序)

题目描述

给定一个整数数组 nums,数组下标从 0 开始。你需要执行以下操作,直到无法再执行为止:

  1. 选择两个互不相同且未标记的下标 ij
  2. 满足条件 2 * nums[i] <= nums[j],则标记下标 ij

你需要返回 nums 中最多可以标记的下标数目。

思路分析

这个问题可以通过贪心算法来解决。我们首先对数组进行排序,这样可以保证较小的元素在前面,较大的元素在后面。然后,我们从数组的两端开始,每次选择一个较小的元素 i 和一个较大的元素 j,检查是否满足 2 * nums[i] <= nums[j] 的条件。如果满足,我们就标记这两个下标,并将 ij 都向后移动一位,继续检查下一个较小的元素和下一个较大的元素。这个过程会一直进行,直到 i 达到数组的中点或者 j 达到数组的末尾。

输入示例

示例 1:

输入:nums = [3,5,2,4]
输出:2
解释:第一次操作中,选择 i = 2 和 j = 1 ,操作可以执行的原因是 2 * nums[2] <= nums[1] ,标记下标 2 和 1 。
没有其他更多可执行的操作,所以答案为 2 。

示例 2:

输入:nums = [9,2,5,4]
输出:4
解释:第一次操作中,选择 i = 3 和 j = 0 ,操作可以执行的原因是 2 * nums[3] <= nums[0] ,标记下标 3 和 0 。
第二次操作中,选择 i = 1 和 j = 2 ,操作可以执行的原因是 2 * nums[1] <= nums[2] ,标记下标 1 和 2 。
没有其他更多可执行的操作,所以答案为 4 。

示例 3:

输入:nums = [7,6,8]
输出:0
解释:没有任何可以执行的操作,所以答案为 0 。

代码实现

import java.util.Arrays;

class Solution {
    public int maxNumOfMarkedIndices(int[] nums) {
        // 对数组进行排序
        Arrays.sort(nums);
        int n = nums.length;
        // 初始化标记计数器
        int count = 0;
        // 初始化两个指针,i 从数组开始,j 从中点开始
        int i = 0, j = n / 2;
        // 遍历数组直到 i 到达中点或者 j 到达数组末尾
        while (i < n / 2 && j < n) {
            // 移动 j 直到找到满足条件的 j
            while (j < n && 2 * nums[i] > nums[j]) {
                j++;
            }
            // 如果找到了满足条件的 j,标记 i 和 j
            if (j < n) {
                count += 2;
                i++;
                j++;
            }
        }
        // 返回标记的下标数目
        return count;
    }
}

标签:下标,标记,2576,nums,int,数组,操作,LeetCode
From: https://blog.csdn.net/Hanbuhuic/article/details/142179683

相关文章

  • LeetCode_0224. 基本计算器,带括号和空格的加减法算式
    题目描述给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如eval()。示例1:输入:s="1+1"输出:2示例2:输入:s="2-1+2"输出:3示例3:输入:s="(1+(4+5+2)-3)+(6+8)"输出:23......
  • SQL.LeetCode(1321)餐馆营业额变化增长
    表: Customer+---------------+---------+|ColumnName|Type|+---------------+---------+|customer_id|int||name|varchar||visited_on|date||amount|int|+---------------+---------+在SQL中,(customer......
  • 爬楼梯(LeetCode)&冒泡和选择排序
    目录一、爬楼梯(LeetCode)1、题目2、代码二、冒泡排序三、选择排序一、爬楼梯(LeetCode)1、题目2、代码二、冒泡排序三、选择排序......
  • LeetCode Hot100刷题记录-142. 环形链表 II
    给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是......
  • leetcode刷题day13|二叉树Part01(递归遍历、迭代遍历、统一迭代、层序遍历)
    递归遍历思路:使用递归的方式比较简单。1、递归函数的传参:因为最后输出一个数组,所以需要传入根节点和一个容器,本来想写数组,但发现长度不能确定,所以选择list。2、终止条件:当访问的节点为空时,return3、递归函数的逻辑:先访问一个节点,递归访问其他节点144.二叉树的前序遍历......
  • leetcode刷题day14|二叉树Part02(以递归方法为主:226.翻转二叉树、101. 对称二叉树、104
    226.翻转二叉树思路:利用先序遍历递归翻转1、终止条件:节点为空,return2、参数:root3、递归函数逻辑:处理中间节点,交换;递归左孩子,递归右孩子代码如下:classSolution{publicTreeNodeinvertTree(TreeNoderoot){if(root==null)returnroot;swapC......
  • Day13 二叉树part03| LeetCode 110.平衡二叉树,二叉树的所有路径,左叶子之和,完全二叉树
    110.平衡二叉树110.平衡二叉树定义:左右子树的高度差的绝对值不超过1深度:从上到下查——>前序遍历(中左右)高度:从下到上查——>后序遍历(左右中)classSolution{publicbooleanisBalanced(TreeNoderoot){if(getHeight(root)==-1)......
  • LeetCode算法—滑动窗口
    一:滑动窗口1、窗口:滑动窗口的核心就是一个窗口;通常使用两个指针表示(一个指向左边界;一个指向右边界);窗口中的元素就是当前字串2、滑动:窗口从数组或字符串的起始位置开始,逐步向右滑动。当窗口无法满足条件时,调整左边界以缩小窗口;当窗口满足条件时,尝试记录当前窗口的结果,并继续调整......
  • LeetCode 977.有序数组的平方 (java)
    给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例1:输入:nums=[-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为[16,1,0,9,100],排序后,数组变为[0,1,9,16,100]示例2:输入:nums=[-7,-3,2,3,11]输出:[4,9,9,......
  • LeetCode 704.二分查找 (java)
    给定一个 n 个元素有序的(升序)整型数组 nums和一个目标值 target ,写一个函数搜索 nums 中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例 2:......