写算法的时候,数组是否有序是一个非常重要的前提
一、LeetCode896. 单调数列https://leetcode.cn/problems/monotonic-array/
一、LeetCode.单调数列
如果数组是单调递增或单调递减的,那么它是 单调 的。
如果对于所有 i <= j
,nums[i] <= nums[j]
,那么数组 nums
是单调递增的。 如果对于所有 i <= j
,nums[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;
}
}
这段代码在判断单调性时使用了两个布尔变量 inc
和 dec
,分别记录单调递增和单调递减的标志,最后只要其中任意一个标志为 true
,就表示当前数组是单调递增或单调递减的,返回 true
,否则返回 false
。
35. 搜索插入位置https://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官方题解中加快了遍历数组的速度,也就是用到了二分查找,现在还没学到,那我就在以后的章节再讨论~