单调数组问题

写算法的时候,数组是否有序是一个非常重要的前提

一、LeetCode896. 单调数列icon-default.png?t=N7T8https://leetcode.cn/problems/monotonic-array/

一、LeetCode.单调数列

如果数组是单调递增或单调递减的,那么它是 单调 

如果对于所有 i <= jnums[i] <= nums[j],那么数组 nums 是单调递增的。 如果对于所有 i <= jnums[i]> = nums[j],那么数组 nums 是单调递减的。

当给定的数组 nums 是单调数组时返回 true,否则返回 false

示例 1:

输入:nums = [1,2,2,3]
输出:true

示例 2:

输入:nums = [6,5,4,4]
输出:true

示例 3:

输入:nums = [1,3,2]
输出:false

讲讲解题思路:

给你一串数组判断是否单调,单调两种情况,递增或递减。

基于此,递增的条件是nums[i] <= nums[i+1]

递减的条件是nums[i] >= nums[i+1]

这两个条件中只要有一个成立时,数组就是单调的,否则就不单调

我们这里就可以用到 || 这种形式,定义两个参数,inc 和 dec. 

结果就是 return inc || dec;

代码如下

class Solution {
    public boolean isMonotonic(int[] nums) {
        // 初始化 inc、dec 为 true,表示默认当前数组是单调递增或单调递减的
        boolean inc = true, dec = true;
        int n = nums.length;
        // 遍历数组元素
        for (int i = 0; i < n - 1; i++){
            // 如果当前元素大于后一个元素,则不满足单调递增的条件,将 inc 设置为 false
            if (nums[i] > nums[i+1]){
                inc = false;
            }
            // 如果当前元素小于后一个元素,则不满足单调递减的条件,将 dec 设置为 false
            if (nums[i] < nums[i+1]){
                dec = false;
            }
        }
        // 如果 inc 或 dec 任一为 true,表示数组是单调递增或单调递减的,返回 true,否则返回 false
        return inc || dec;
    }
}

这段代码在判断单调性时使用了两个布尔变量 incdec,分别记录单调递增和单调递减的标志,最后只要其中任意一个标志为 true,就表示当前数组是单调递增或单调递减的,返回 true,否则返回 false

35. 搜索插入位置icon-default.png?t=N7T8https://leetcode.cn/problems/search-insert-position/

二、LeetCode35.搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

解题思路:主要就是遍历数组,在遍历的时候对比 target 与 nums[i] 的大小

然后返回 i;

有种特殊情况需要注意,就是当循环结束时,还没有return,说明 target值大于数组中所有值,

于是返回数组长度n;

代码如下

class Solution {
    public int searchInsert(int[] nums, int target) {
        int n = nums.length;
        int i = 0;
        while (i < n){
            if (target > nums[i]){
                i++;
            }
            else
            {
                return i;
            }
        }
        return n;
    }
}

这段代码的时间复杂度可以优化,在LeetCode官方题解中加快了遍历数组的速度,也就是用到了二分查找,现在还没学到,那我就在以后的章节再讨论~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值