1752. Check if Array Is Sorted and Rotated

The idea of this solution is to loop through the array, and then check whether there is a nums[i] which is greater than nums[(i+1) % len(nums)] (By the way (i+1) % len(nums) is for getting the next number) if nums[i] > nums[(i+1)%len(nums)] then add one to a counter called counter. Then we check whether counter is greater than or equal to 2.

We check whether counteris greater than or eqal to 2 because if there are more than one nums[i] > nums[(i+1)%len(nums)] we know that it is not sorted.

This is sorted, we know because there is only one nums[i] > nums[(i+1)%len(nums)]. The array is [4, 5, 1, 2, 3] and when we rotate it we get [1, 2, 3, 4, 5].

We we can see that the array [2, 5, 1, 4, 3] can never be rotated and be sorted: [5, 1, 4, 3, 2] [1, 4, 3, 2, 5] [4, 3, 2, 5, 1] [3, 2, 5, 1, 4] [2, 5, 1, 4, 3]

As you can see there is two nums[i] > nums[(i+1)%len(nums)] so it will never be sorted.

The input is already sorted, but even without that we can see that there is only one nums[i] > nums[(i+1)%len(nums)].


func check(nums []int) bool {
    counter := 0

    for i := 0; i < len(nums); i++ {
        if nums[i] > nums[(i+1)%len(nums)] {
            counter++
        }
        if counter >= 2 {
            return false
        }
    }

    return true
}

We could make the first solution a little better by doing: (This is better because we are only checking the if when we add to counter and not every single time)

func check(nums []int) bool {
    counter := 0

    for i := 0; i < len(nums); i++ {
        if nums[i] > nums[(i+1)%len(nums)] {
            counter++
            if counter >= 2 {
                return false
            }
        }

    }

    return true
}