LeetCode 3507.移除最小数对使数组有序 I:纯模拟

【LetMeFly】3507.移除最小数对使数组有序 I:纯模拟

力扣题目链接:https://leetcode.cn/problems/minimum-pair-removal-to-sort-array-i/

给你一个数组 nums,你可以执行以下操作任意次数:

  • 选择 相邻 元素对中 和最小 的一对。如果存在多个这样的对,选择最左边的一个。
  • 用它们的和替换这对元素。

返回将数组变为 非递减 所需的 最小操作次数

如果一个数组中每个元素都大于或等于它前一个元素(如果存在的话),则称该数组为非递减

示例 1:
输入: nums = [5,2,3,1]

输出: 2

解释:

  • 元素对 (3,1) 的和最小,为 4。替换后 nums = [5,2,4]
  • 元素对 (2,4) 的和为 6。替换后 nums = [5,6]

数组 nums 在两次操作后变为非递减。

示例 2:
输入: nums = [1,2,2]

输出: 0

解释:

数组 nums 已经是非递减的。

提示:

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

解题方法:模拟

写个函数判断是否已经非递减、写个函数判断哪个下标开始的数对被合并、写个函数合并两个数。

完事。

  • 时间复杂度 O ( l e n ( n u m s ) 2 ) O(len(nums)^2) O(len(nums)2)
  • 空间复杂度 O ( l e n ( n u m s ) ) O(len(nums)) O(len(nums))

AC代码

C++
cpp 复制代码
/*
 * @LastEditTime: 2026-01-22 23:47:47
 */
template<class Type>
void debug(vector<Type>v) {
    for(int i = 0; i < v.size(); i++) {
        cout << v[i] << ' ';
    }
    puts("");
}

class Solution {
private:
    bool finished(vector<int>& nums) {
        for (int i = 1; i < nums.size(); i++) {
            if (nums[i] < nums[i - 1]) {
                return false;
            }
        }
        return true;
    }

    // len(nums)一定大于等于2
    int getMinPairIdx(vector<int>& nums) {
        int idx = 0, mini = 50001;  // 这里不能是2001
        for (int i = 0; i + 1 < nums.size(); i++) {
            int cnt = nums[i] + nums[i + 1];
            if (cnt < mini) {
                mini = cnt;
                idx = i;
            }
        }
        return idx;
    }

    vector<int> merge(vector<int>& nums, int idx) {
        vector<int> ans;
        for (int i = 0; i < idx; i++) {
            ans.push_back(nums[i]);
        }
        ans.push_back(nums[idx] + nums[idx + 1]);
        for (int i = idx + 2; i < nums.size(); i++) {
            ans.push_back(nums[i]);
        }
        return ans;
    }
public:
    int minimumPairRemoval(vector<int>& nums) {
        int ans = 0;
        while (!finished(nums)) {
            int idx = getMinPairIdx(nums);
            nums = merge(nums, idx);
            // debug(nums);
            ans++;  // don't forgot
        }
        return ans;
    }
};

/*
[689,-360,234,673,663,-741,480,860,-707,209,246,792,930,696,-305]

My:
689 -360 234 673 663 -741 480 860 -498 246 792 930 696 -305 
689 -360 234 673 663 -261 860 -498 246 792 930 696 -305 
689 -360 234 673 663 -261 860 -252 792 930 696 -305 
689 -126 673 663 -261 860 -252 792 930 696 -305 
689 -126 673 663 -261 860 -252 792 930 391 
689 -126 673 402 860 -252 792 930 391 
689 -126 673 402 860 540 930 391 
689 547 402 860 540 930 391 
689 949 860 540 930 391 
689 949 860 540 1321 
689 949 1400 1321 
1638 1400 1321   <-----应该merge后俩
3038 1321 
4359 

14


should:
689 -360 234 673 663 -741 480 860 -498 246 792 930 696 -305 
689 -360 234 673 663 -261 860 -498 246 792 930 696 -305 
689 -360 234 673 663 -261 860 -252 792 930 696 -305
689 -126 673 663 -261 860 -252 792 930 696 -305
689 -126 673 663 -261 860 -252 792 930 391
689 -126 673 402 860 -252 792 930 391
689 -126 673 402 860 540 930 391
689 547 402 860 540 930 391
689 949 860 540 930 391
689 949 860 540 1321
689 949 1400 1321
1638 1400 1321
1638 2721

13
*/
Rust
rust 复制代码
/*
 * @LastEditTime: 2026-01-22 23:55:38
 */
impl Solution {
    fn finished(nums: &Vec<i32>) -> bool {
        for i in 1..nums.len() {
            if nums[i] < nums[i - 1] {
                return false;
            }
        }
        true
    }

    fn get_mini_pair_idx(nums: &Vec<i32>) -> usize {
        let mut idx = 0;
        let mut mini = 500001;
        for i in 0..nums.len() - 1 {
            let cnt = nums[i] + nums[i + 1];
            if cnt < mini {
                mini = cnt;
                idx = i;
            }
        }
        idx
    }

    fn merge(nums: &Vec<i32>, idx: usize) -> Vec<i32> {
        let mut ans = Vec::with_capacity(nums.len() - 1);
        for i in 0..idx {
            ans.push(nums[i]);
        }
        ans.push(nums[idx] + nums[idx + 1]);
        for i in idx + 2..nums.len() {
            ans.push(nums[i]);
        }
        ans
    }

    pub fn minimum_pair_removal(mut nums: Vec<i32>) -> i32 {
        let mut ans = 0;
        while !Self::finished(&nums) {
            let idx = Self::get_mini_pair_idx(&nums);
            nums = Self::merge(&nums, idx);
            ans += 1;
        }
        ans
    }
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
无极低码4 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发5 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
superior tigre5 小时前
22 括号生成
算法·深度优先
努力也学不会java6 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎7 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
ECT-OS-JiuHuaShan7 小时前
朱梁万有递归元定理,重构《易经》
算法·重构
汉克老师7 小时前
GESP2026年3月认证C++四级( 第二部分判断题(1-10))
c++·指针·函数重载·文件操作·数组·gesp4级·gesp四级
智者知已应修善业7 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
khddvbe8 小时前
C++并发编程中的死锁避免
开发语言·c++·算法