LeetCode每日一题(2155. All Divisions With the Highest Score of a Binary Array)

You are given a 0-indexed binary array nums of length n. nums can be divided at index i (where 0 <= i <= n) into two arrays (possibly empty) numsleft and numsright:

numsleft has all the elements of nums between index 0 and i - 1 (inclusive), while numsright has all the elements of nums between index i and n - 1 (inclusive).
If i == 0, numsleft is empty, while numsright has all the elements of nums.
If i == n, numsleft has all the elements of nums, while numsright is empty.
The division score of an index i is the sum of the number of 0’s in numsleft and the number of 1’s in numsright.

Return all distinct indices that have the highest possible division score. You may return the answer in any order.

Example 1:

Input: nums = [0,0,1,0]
Output: [2,4]

Explanation: Division at index

  • 0: numsleft is []. numsright is [0,0,1,0]. The score is 0 + 1 = 1.
  • 1: numsleft is [0]. numsright is [0,1,0]. The score is 1 + 1 = 2.
  • 2: numsleft is [0,0]. numsright is [1,0]. The score is 2 + 1 = 3.
  • 3: numsleft is [0,0,1]. numsright is [0]. The score is 2 + 0 = 2.
  • 4: numsleft is [0,0,1,0]. numsright is []. The score is 3 + 0 = 3.
    Indices 2 and 4 both have the highest possible division score 3.
    Note the answer [4,2] would also be accepted.

Example 2:

Input: nums = [0,0,0]
Output: [3]

Explanation: Division at index

  • 0: numsleft is []. numsright is [0,0,0]. The score is 0 + 0 = 0.
  • 1: numsleft is [0]. numsright is [0,0]. The score is 1 + 0 = 1.
  • 2: numsleft is [0,0]. numsright is [0]. The score is 2 + 0 = 2.
  • 3: numsleft is [0,0,0]. numsright is []. The score is 3 + 0 = 3.
    Only index 3 has the highest possible division score 3.

Example 3:

Input: nums = [1,1]
Output: [0]

Explanation: Division at index

  • 0: numsleft is []. numsright is [1,1]. The score is 0 + 2 = 2.
  • 1: numsleft is [1]. numsright is [1]. The score is 0 + 1 = 1.
  • 2: numsleft is [1,1]. numsright is []. The score is 0 + 0 = 0.
    Only index 0 has the highest possible division score 2.

Constraints:

  • n == nums.length
  • 1 <= n <= 105
  • nums[i] is either 0 or 1.

prefix_sum 用来记录到当前位置为止 0 的数量, suffix_sum 用来记录到当前位置为止 1 的数量(倒序), prefix_sum[i] + suffix_sum[i]即为以 i 作为分界线所能拿到的分数,我们只需要返回所有的最大分数的 index 就可以了



impl Solution {
    pub fn max_score_indices(nums: Vec<i32>) -> Vec<i32> {
        let mut prefix_sum: Vec<i32> = nums
            .iter()
            .scan(0, |s, n| {
                if *n == 0 {
                    *s += 1;
                }
                Some(*s)
            })
            .collect();
        prefix_sum.insert(0, 0);
        let mut suffix_sum: Vec<i32> = nums
            .iter()
            .rev()
            .scan(0, |s, n| {
                if *n == 1 {
                    *s += 1;
                }
                Some(*s)
            })
            .collect();
        suffix_sum.reverse();
        suffix_sum.push(0);
        let mut max = 0;
        let mut ans = Vec::new();
        for (i, (a, b)) in prefix_sum.into_iter().zip(suffix_sum).enumerate() {
            if a + b == max {
                ans.push(i as i32);
            }
            if a + b > max {
                max = a + b;
                ans.clear();
                ans.push(i as i32);
            }
        }
        ans
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值