刷题的日常-检查数组是否经排序和轮转得到

74 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

刷题的日常-2022年11月27号

一天一题,保持脑子清爽

检查数组是否经排序和轮转得到

来自leetcode的 1752 题,题意如下:

给你一个数组 nums 。nums 的源数组中,所有元素与 nums 相同,但按非递减顺序排列。

如果 nums 能够由源数组轮转若干位置(包括 0 个位置)得到,则返回 true ;否则,返回 false 。 源数组中可能存在 重复项 。

注意:我们称数组 A 在轮转 x 个位置后得到长度相同的数组 B ,当它们满足 A[i] == B[(i+x) % A.length] ,其中 % 为取余运算。

理解题意

通过题意,我们可以将信息整理如下:

  • 题目给出一个数组
  • 要求我们对数组进行检查,如果数组能从某个位置开始,一直往后都是非递减的返回true
  • 也就是说数组要能够按照某个顺序轮着走一圈不会出现递减的情况

做题思路

从题意理解,可能需要找出第一个递减的点,因为这里可能是拐点,如果出现多个拐点的话,那么就不符合要求。拐点只有一个,我们可以在遍历的过程中进行记录,还有不能只遍历一次数组里面的内容,需要再多循环一个,然后通过拐点来判断是否存在多个拐点,步骤如下:

  • 开辟一个布尔值,遇到拐点进行记录
  • 开辟一个变量记录上一个扫描的数据,另外开辟一个变量记录需要扫描的长度
  • 这里需要扫描 数组长度 + 1
  • 对当前位置去摸,如果当前值比前一个值大,并且已经出现过拐点,返回false
  • 否则更新拐点字段 和 前一个值的记录
  • 都能通过返回true

代码实现

代码实现如下:

public class Solution {
    public boolean check(int... nums) {
        boolean flip = false;
        int pre = nums[0], idx, len = nums.length + 1;
        for (int i = 0; i < len; i++) {
            idx = i % nums.length;
            if (flip && nums[idx] < pre) {
                return false;
            }
            flip |= nums[idx] < pre;
            pre = nums[idx];
        }
        return true;
    }
}

4ff0fa5cb00148fb282f041262df117.png