移动 [5981] 分组得分最高的所有下标

public class Solution {
    public IList<int> MaxScoreIndices(int[] nums) {
      // 默认初始化返回结果的大小
      List<int> ans = new List<int>(nums.Length);
    
      // maxVal : 当前最大值
      // num : 左边分出的数组元素为0的个数
      // ii : 分离左右数组的中间下标
      int maxVal = 0, num = 0, ii = nums.Length;
      
      // 这里直接处理ii为nums.Length的情况
      // 即右边的数组为nums本身,二左边的数组为空
      for(int i = 0; i < nums.Length; i++){
        if(nums[i] == 0)
          num++;
      }
      
      // 记录 ii == nums.Length的情况
      maxVal = num;
      ans.Add(ii);
      
      // num0 : 右边分出的数组元素为1的个数
      int num0 = 0;
      for(int i = ii - 1; i >= 0; i--){
        // 当遇到 1则累加 右边数组1的个数记录,否则雷减左边数组0的个数记录
        if(nums[i] == 1){
          num0++;
        }else{
          num--;
        }
        
        // 计算结果
        int tmpVal = num0 + num;
        if(tmpVal > maxVal){
          // 如果当前的maxVal不是最大值则记录当前最大值,清空下标记录
          maxVal = tmpVal; 

          ans.Clear();
          ans.Add(i);
        }else if(tmpVal == maxVal){
          // 记录相同的最大值下标
          ans.Add(i);	
        }
      }
      
      return ans;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值