Description
Given an array nums, return true if the array was originally sorted in non-decreasing order, then rotated some number of positions (including zero). Otherwise, return false.
There may be duplicates in the original array.
Note: An array A rotated by x positions results in an array B of the same length such that B[i] == A[(i+x) % A.length] for every valid index i.
Example 1:
Input: nums = [3,4,5,1,2] Output: true Explanation: [1,2,3,4,5] is the original sorted array. You can rotate the array by x = 2 positions to begin on the element of value 3: [3,4,5,1,2].
Example 2:
Input: nums = [2,1,3,4] Output: false Explanation: There is no sorted array once rotated that can make nums.
Example 3:
Input: nums = [1,2,3] Output: true Explanation: [1,2,3] is the original sorted array. You can rotate the array by x = 0 positions (i.e. no rotation) to make nums.
Constraints:
1 <= nums.length <= 1001 <= nums[i] <= 100
Solutions
This function checks whether an array of numbers is a rotated sorted array (meaning it could be sorted if rotated). It works by appending the first element to the end of the array, then scanning through to count how many times a number is greater than the next number — these are called "break points." If there's zero or one break point, the array is a valid rotation of a sorted array and returns true; if there are two or more break points, it means the array can't be sorted by rotation and returns false. For example, [3,4,5,1,2] has exactly one break point (where 5 > 1), so it returns true, while [2,1,3,4] has multiple breaks and returns false.
/**
* @param {number[]} nums
* @return {boolean}
*/
var check = function(nums) {
let seen = false;
nums.push(nums[0]);
for (let i = 0; i < nums.length - 1; i++) {
if (nums[i] > nums[i + 1]) {
if (seen) {
return false;
}
seen = true;
}
}
return true;
};