題目連結:
題目意譯:
給定一個陣列 nums,如果陣列原先是非遞減順序排列,只是其後被旋轉了若干位置(包含 0)的話,則回傳真(True);反之,回傳假(False)。
原始陣列中可能包含重複的數字。
注: 一陣列 A 旋轉 x 個位置將得到另一個長度相同的陣列 B 使得 A[i] == B[(i+x) % A.length],其中 % 為模除操作。
限制:
1 ≦ nums.length ≦ 100
1 ≦ nums[i] ≦ 100
範例測資:
範例 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。
解題思維:
(令 n = nums.length)
把 nums 複製一份並由非遞減順序排序(稱此陣列為 sorted)。
然後找到某個元素 nums[i] 恰好等於 sorted[0] 之後,之後就檢查 nums[i + 1] 是否等於 sorted[1] 、 nums[i + 2] 是否等於 sorted[2] 、……、nums[n - 1] 是否等於 sorted[n - i - 1],然後再檢查 nums[0] 是否等於 sorted[n - i]、……。
如果 sorted 都掃完之後都是一致的話,則代表 sorted 本身經過若干次旋轉後可以變為 nums;反之則代表不存在已排序的陣列旋轉後可得到 nums。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。