• 一、数组---非递减数列※※※※※


    给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元素的情况下,该数组能否变成一个非递减数列。

    我们是这样定义一个非递减数列的: 对于数组中所有的 i (1 <= i < n),满足 array[i] <= array[i + 1]。

    示例 1:

    输入: [4,2,3]
    输出: True
    解释: 你可以通过把第一个4变成1来使得它成为一个非递减数列。
    示例 2:

    输入: [4,2,1]
    输出: False
    解释: 你不能在只改变一个元素的情况下将其变为非递减数列。
    说明:  n 的范围为 [1, 10,000]。

     1 class Solution {
     2 public:
     3     bool checkPossibility(vector<int>& nums) {
     4         int len=nums.size();
     5         int count=0;
     6         // 数组个数小于2个 一定可以
     7         if(len<3) return true;
     8         // 思路如下:
     9         // 如果出现 a[i] > a[i+1]   改变一个数 就面临两种选择
    10         // 1. 把a[i]变大
    11         // 2. 把a[i+1] 变小
    12         // 这两种选择其实是有依据的 需要比较a[i-1] 与 a[i+1]的值
    13         // eg.  ... 1 4 3 ...   只能选择把4变小   ... 3 4 1 ... 只能选择把1变大
    14         // 改变完之后,记录改变次数,再检测是否升序
    15         // 如果次数大于1,至少改了两次 返回false
    16     
    17         // 先让前两个有序
    18         // 因为没有左边没有数 所以对于前两个数来说,最佳选择就是吧 a[0] 变小
    19         if(nums[0]>nums[1]){
    20             nums[0] = nums[1];
    21             count+=1;
    22         }
    23         for(int i=1;i<len-1;i++){
    24             if(nums[i] > nums[i+1]){
    25                 count +=1;
    26                 if(count > 1) return false;
    27                 if(nums[i-1] < nums[i+1]) nums[i]=nums[i-1];
    28                 else nums[i+1]=nums[i];
    29             }
    30         }
    31         return true;
    32     }
    33 };
  • 相关阅读:
    [Windows Azure] Windows Azure Web Sites, Cloud Services, and VMs: When to use which?
    [Windows Azure] Windows Azure Execution Models
    [Windows Azure] Load Testing in Windows Azure
    [Windows Azure]The Autoscaling Application Block
    [Windows Azure]Windows Azure Identity
    [Windows Azure] Data Management and Business Analytics
    alienware Win8 系统安装
    Navisworks Addin 插件集成
    Navisworks 2014 Api 简单的使用
    Winform简单调用WebApi
  • 原文地址:https://www.cnblogs.com/pacino12134/p/11017832.html
Copyright © 2020-2023  润新知