carloscn / structstudy

Leetcode daily trainning by using C/C++/RUST programming.
4 stars 1 forks source link

leetcode2357: Make Array Zero by Subtracting Equal Amounts #386

Open carloscn opened 1 year ago

carloscn commented 1 year ago

Description

You are given a non-negative integer array nums. In one operation, you must:

Choose a positive integer x such that x is less than or equal to the smallest non-zero element in nums. Subtract x from every positive element in nums. Return the minimum number of operations to make every element in nums equal to 0.

Example 1:

Input: nums = [1,5,0,3,5] Output: 3 Explanation: In the first operation, choose x = 1. Now, nums = [0,4,0,2,4]. In the second operation, choose x = 2. Now, nums = [0,2,0,0,2]. In the third operation, choose x = 2. Now, nums = [0,0,0,0,0].

Example 2:

Input: nums = [0] Output: 0 Explanation: Each element in nums is already 0 so no operations are needed.

Constraints:

1 <= nums.length <= 100 0 <= nums[i] <= 100

carloscn commented 1 year ago

Analysis

pub fn minimum_operations(nums: Vec<i32>) -> i32
{
    let mut ret:i32 = 0;
    if nums.len() < 1 || (nums.len() == 1 && nums[0] == 0) {
        return ret;
    }
    let mut input = nums.clone();

    loop {
        let min_value = input.iter().fold(i32::MAX, |mut min, x| {
            if *x != 0 && *x < min {
                min = *x;
            }
            min
        });

        let mut count_zero:usize = 0;
        for i in 0..input.len() {
            input[i] = (input[i] - min_value).max(0);
            if input[i] == 0 {
                count_zero += 1;
            }
        }

        ret += 1;
        if count_zero == nums.len() {
            break;
        }
    }

    return ret;
}
carloscn commented 1 year ago

Code

https://review.gerrithub.io/c/carloscn/structstudy/+/1170822 https://github.com/carloscn/structstudy/commit/fcec4f51c0d4f8bd2f72c7dd403e7d9b55662bf7