2155. 分组得分最高的所有下标

该博客主要介绍了如何使用Java解决LeetCode中的2155题,即找到数组中分组得分最高的所有下标。解题策略是通过维护前缀和,遍历数组,当遇到0时增加前缀和,若前缀和超过历史最大值,则更新答案并重置下标集合;若等于历史最大值,则将当前下标加入集合。博主分享了具体的Java代码实现及运行结果。
摘要由CSDN通过智能技术生成

>【★】2155. 分组得分最高的所有下标<

>maxScoreIndices<

在这里插入图片描述


一、解题思路

1、解法一( Java )

解法思路:单次循环
根据下标 inums拆分成两个数组,对数组进行 一次遍历,并维护前缀和。对于当前遍历到的位置 i,如果前缀和 preSum 大于历史最大值 max ,那么就对历史最大值进行更新,并重置历史最大值对应的下标为 i;如果其等于历史最大值,那么只需要将 i 加入历史最大值的下标集合即可。

前缀和的定义为:如果遇到 0 就增加 1,否则减少 1。

代码如下:

/**
 * @author listen1024
 * @date 2022-2-8
 * 【★】2155. 分组得分最高的所有下标
 */
class Solution {
    public List<Integer> maxScoreIndices(int[] nums) {
        List<Integer> ans=new ArrayList<>();
        ans.add(0);
        int max=0,preSum=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i] == 0){
                preSum++;
                if(preSum > max){
                    ans=new ArrayList<>();
                    ans.add(i+1);
                    max=preSum;
                }
                else if(preSum == max){
                    ans.add(i+1);
                }
            }
            else{
                preSum--;
            }
        }
        return ans;
    }
}

运行结果截图如下:
运行结果截图

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值