Skip to content

Latest commit

 

History

History

1752.Check if Array Is Sorted and Rotated

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 

English Version

题目描述

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

如果 nums 能够由源数组轮转若干位置(包括 0 个位置)得到,则返回 true ;否则,返回 false

源数组中可能存在 重复项

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

 

示例 1:

输入:nums = [3,4,5,1,2]
输出:true
解释:[1,2,3,4,5] 为有序的源数组。
可以轮转 x = 3 个位置,使新数组从值为 3 的元素开始:[3,4,5,1,2] 。

示例 2:

输入:nums = [2,1,3,4]
输出:false
解释:源数组无法经轮转得到 nums 。

示例 3:

输入:nums = [1,2,3]
输出:true
解释:[1,2,3] 为有序的源数组。
可以轮转 x = 0 个位置(即不轮转)得到 nums 。

 

提示:

  • 1 <= nums.length <= 100
  • 1 <= nums[i] <= 100

解法

方法一:一次遍历

要满足题目要求,那么数组 nums 中最多只能存在一个元素,其值大于下一个元素,即 $nums[i] \gt nums[i + 1]$。如果存在多个这样的元素,那么数组 nums 无法通过轮转得到。

注意,数组 nums 最后一个元素的下一个元素是数组 nums 的第一个元素。

时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 nums 的长度。

Python3

class Solution:
    def check(self, nums: List[int]) -> bool:
        n = len(nums)
        return sum(v > nums[(i + 1) % n] for i, v in enumerate(nums)) <= 1

Java

class Solution {
    public boolean check(int[] nums) {
        int n = nums.length;
        int cnt = 0;
        for (int i = 0; i < n; ++i) {
            if (nums[i] > nums[(i + 1) % n]) {
                ++cnt;
            }
        }
        return cnt <= 1;
    }
}

C++

class Solution {
public:
    bool check(vector<int>& nums) {
        int n = nums.size();
        int cnt = 0;
        for (int i = 0; i < n; ++i) {
            cnt += nums[i] > (nums[(i + 1) % n]);
        }
        return cnt <= 1;
    }
};

Go

func check(nums []int) bool {
	n := len(nums)
	cnt := 0
	for i, v := range nums {
		if v > nums[(i+1)%n] {
			cnt++
		}
	}
	return cnt <= 1
}

...