Welcome to Subscribe On Youtube

3507. Minimum Pair Removal to Sort Array I

Description

Given an array nums, you can perform the following operation any number of times:

  • Select the adjacent pair with the minimum sum in nums. If multiple such pairs exist, choose the leftmost one.
  • Replace the pair with their sum.

Return the minimum number of operations needed to make the array non-decreasing.

An array is said to be non-decreasing if each element is greater than or equal to its previous element (if it exists).

 

Example 1:

Input: nums = [5,2,3,1]

Output: 2

Explanation:

  • The pair (3,1) has the minimum sum of 4. After replacement, nums = [5,2,4].
  • The pair (2,4) has the minimum sum of 6. After replacement, nums = [5,6].

The array nums became non-decreasing in two operations.

Example 2:

Input: nums = [1,2,2]

Output: 0

Explanation:

The array nums is already sorted.

 

Constraints:

  • 1 <= nums.length <= 50
  • -1000 <= nums[i] <= 1000

Solutions

Solution 1

  • class Solution {
        public int minimumPairRemoval(int[] nums) {
            List<Integer> arr = new ArrayList<>();
            for (int x : nums) {
                arr.add(x);
            }
            int ans = 0;
            while (!isNonDecreasing(arr)) {
                int k = 0;
                int s = arr.get(0) + arr.get(1);
                for (int i = 1; i < arr.size() - 1; ++i) {
                    int t = arr.get(i) + arr.get(i + 1);
                    if (s > t) {
                        s = t;
                        k = i;
                    }
                }
                arr.set(k, s);
                arr.remove(k + 1);
                ++ans;
            }
            return ans;
        }
    
        private boolean isNonDecreasing(List<Integer> arr) {
            for (int i = 1; i < arr.size(); ++i) {
                if (arr.get(i) < arr.get(i - 1)) {
                    return false;
                }
            }
            return true;
        }
    }
    
    
  • class Solution {
    public:
        int minimumPairRemoval(vector<int>& nums) {
            vector<int> arr = nums;
            int ans = 0;
    
            while (!isNonDecreasing(arr)) {
                int k = 0;
                int s = arr[0] + arr[1];
    
                for (int i = 1; i < arr.size() - 1; ++i) {
                    int t = arr[i] + arr[i + 1];
                    if (s > t) {
                        s = t;
                        k = i;
                    }
                }
    
                arr[k] = s;
                arr.erase(arr.begin() + (k + 1));
                ++ans;
            }
    
            return ans;
        }
    
    private:
        bool isNonDecreasing(const vector<int>& arr) {
            for (int i = 1; i < (int) arr.size(); ++i) {
                if (arr[i] < arr[i - 1]) {
                    return false;
                }
            }
            return true;
        }
    };
    
    
  • class Solution:
        def minimumPairRemoval(self, nums: List[int]) -> int:
            arr = nums[:]
            ans = 0
    
            def is_non_decreasing(a: List[int]) -> bool:
                for i in range(1, len(a)):
                    if a[i] < a[i - 1]:
                        return False
                return True
    
            while not is_non_decreasing(arr):
                k = 0
                s = arr[0] + arr[1]
                for i in range(1, len(arr) - 1):
                    t = arr[i] + arr[i + 1]
                    if s > t:
                        s = t
                        k = i
                arr[k] = s
                arr.pop(k + 1)
                ans += 1
            return ans
    
    
  • func minimumPairRemoval(nums []int) int {
    	arr := append([]int(nil), nums...)
    	ans := 0
    
    	isNonDecreasing := func(a []int) bool {
    		for i := 1; i < len(a); i++ {
    			if a[i] < a[i-1] {
    				return false
    			}
    		}
    		return true
    	}
    
    	for !isNonDecreasing(arr) {
    		k := 0
    		s := arr[0] + arr[1]
    
    		for i := 1; i < len(arr)-1; i++ {
    			t := arr[i] + arr[i+1]
    			if s > t {
    				s = t
    				k = i
    			}
    		}
    
    		arr[k] = s
    		copy(arr[k+1:], arr[k+2:])
    		arr = arr[:len(arr)-1]
    		ans++
    	}
    
    	return ans
    }
    
    
  • function minimumPairRemoval(nums: number[]): number {
        const arr = nums.slice();
        let ans = 0;
        const isNonDecreasing = (a: number[]): boolean => {
            for (let i = 1; i < a.length; i++) {
                if (a[i] < a[i - 1]) {
                    return false;
                }
            }
            return true;
        };
        while (!isNonDecreasing(arr)) {
            let k = 0;
            let s = arr[0] + arr[1];
            for (let i = 1; i < arr.length - 1; ++i) {
                const t = arr[i] + arr[i + 1];
                if (s > t) {
                    s = t;
                    k = i;
                }
            }
            arr[k] = s;
            arr.splice(k + 1, 1);
            ans++;
        }
        return ans;
    }
    
    
  • impl Solution {
        pub fn minimum_pair_removal(nums: Vec<i32>) -> i32 {
            let mut arr: Vec<i32> = nums.clone();
            let mut ans: i32 = 0;
    
            fn is_non_decreasing(a: &Vec<i32>) -> bool {
                for i in 1..a.len() {
                    if a[i] < a[i - 1] {
                        return false;
                    }
                }
                true
            }
    
            while !is_non_decreasing(&arr) {
                let mut k: usize = 0;
                let mut s: i32 = arr[0] + arr[1];
                for i in 1..arr.len() - 1 {
                    let t: i32 = arr[i] + arr[i + 1];
                    if s > t {
                        s = t;
                        k = i;
                    }
                }
                arr[k] = s;
                arr.remove(k + 1);
                ans += 1;
            }
    
            ans
        }
    }
    
    

All Problems

All Solutions