算法日志 --- 11.27---检查数组是否经过排序和轮转得到

94 阅读2分钟

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

不知不觉就已经周日了,明天又要上班了,但是并不妨碍我居家办公嘿嘿嘿

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

该题出自力扣的1752题 —— 检查数组是否经过排序和轮转得到【简单题】

审题

给你一个数组 nums 。nums 的源数组中,所有元素与 nums 相同,但按非递减顺序排列。 如果 nums 能够由源数组轮转若干位置(包括 0 个位置)得到,则返回 true ;否则,返回 false 。 源数组中可能存在 重复项 。 注意:我们称数组 A 在轮转 x 个位置后得到长度相同的数组 B ,当它们满足 A[i] == B[(i+x) % A.length] ,其中 % 为取余运算。

  • 这道题的题目并不难理解,就是给出一个整型数组,该数组是轮转后的结果,源数组为该数组内数值的非递减排序,那么就很好理解到了,判断数组是否是轮转后的结果,就需要遵循轮转的业务规则
    • 轮转的话,就需要局部遵守原数组的排序,相当于是排序,但是只能排序一次,也就是说,只能存在一次i + 1的下标小于i的情况
    • 假如轮转0个位置,那么也就是说维持不变
  • 汇总成技术实现的话就是,i + 1 的下标只能有一次小于 i,大于就可以返回false。如果有一次小于i,那么最后一位必定小于第一位
  • 比较相邻元素(将数组看成环形,最后一个元素的下一个元素是第一个元素),最多只能出现一次前一个数大于后一个数的情况

编码

class Solution {
    public boolean check(int[] nums) {
        int count = 0;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] < nums[i - 1])count++;
            if (count > 1){
                return false;
            }
        }
        return count == 1?nums[nums.length - 1]<=nums[0]:true;

    }
}

image.png