解题思路

  1. 核心思路

    • 遍历序列,找到所有递减的位置(即 的位置)
    • 如果递减点超过1个,则无法通过修改一个数实现非递减
    • 对于单个递减点,尝试修改其中一个数,检查是否可以实现非递减
  2. 处理方法

    • 对于递减点 i,我们有两种修改方案:
      • 改小,使其不大于
      • 改大,使其不小于
    • 需要确保修改后不会产生新的递减点

代码

#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
    bool checkSequence(vector<int>& nums) {
        int n = nums.size();
        int count = 0;  // 记录递减点的个数
        
        // 复制原始序列,用于尝试修改
        vector<int> temp = nums;
        
        for (int i = 0; i < n - 1; i++) {
            if (temp[i] > temp[i + 1]) {
                count++;
                if (count > 1) {
                    return false;
                }
                
                // 尝试修改temp[i]或temp[i+1]
                if (i == 0 || temp[i - 1] <= temp[i + 1]) {
                    temp[i] = temp[i + 1];  // 将temp[i]改小
                } else {
                    temp[i + 1] = temp[i];  // 将temp[i+1]改大
                }
            }
        }
        
        return true;
    }
};

int main() {
    // 读取输入
    vector<int> nums;
    int num;
    while (cin >> num) {
        nums.push_back(num);
    }
    
    // 解决问题
    Solution solution;
    cout << (solution.checkSequence(nums) ? 1 : 0) << endl;
    
    return 0;
}
import java.util.*;

public class Main {
    static class Solution {
        public boolean checkSequence(int[] nums) {
            int n = nums.length;
            int count = 0;  // 记录递减点的个数
            
            // 复制原始序列,用于尝试修改
            int[] temp = nums.clone();
            
            for (int i = 0; i < n - 1; i++) {
                if (temp[i] > temp[i + 1]) {
                    count++;
                    if (count > 1) {
                        return false;
                    }
                    
                    // 尝试修改temp[i]或temp[i+1]
                    if (i == 0 || temp[i - 1] <= temp[i + 1]) {
                        temp[i] = temp[i + 1];  // 将temp[i]改小
                    } else {
                        temp[i + 1] = temp[i];  // 将temp[i+1]改大
                    }
                }
            }
            
            return true;
        }
    }
    
    public static void main(String[] args) {
        // 读取输入
        Scanner scanner = new Scanner(System.in);
        List<Integer> list = new ArrayList<>();
        while (scanner.hasNextInt()) {
            list.add(scanner.nextInt());
        }
        
        // 转换为数组
        int[] nums = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            nums[i] = list.get(i);
        }
        
        // 解决问题
        Solution solution = new Solution();
        System.out.println(solution.checkSequence(nums) ? 1 : 0);
    }
}
def check_sequence(nums: list) -> bool:
    """检查序列是否可以通过修改一个数变成非递减序列"""
    n = len(nums)
    count = 0  # 记录递减点的个数
    
    # 复制原始序列,用于尝试修改
    nums = nums.copy()
    
    for i in range(n-1):
        if nums[i] > nums[i+1]:
            count += 1
            if count > 1:
                return False
            
            # 尝试修改nums[i]或nums[i+1]
            # 1. 如果是第一个元素,或者nums[i-1]小于等于nums[i+1]
            if i == 0 or nums[i-1] <= nums[i+1]:
                nums[i] = nums[i+1]  # 将nums[i]改小
            else:
                nums[i+1] = nums[i]  # 将nums[i+1]改大
    
    return True

def solve(nums: list) -> int:
    """解决问题的主函数"""
    return 1 if check_sequence(nums) else 0

if __name__ == "__main__":
    # 读取输入
    nums = list(map(int, input().split()))
    
    # 输出结果
    print(solve(nums))

算法及复杂度

  • 算法:贪心
  • 时间复杂度:,其中 为序列长度
  • 空间复杂度:,用于存储序列副本