C++程序 判断数组是否排序且旋转
给定一个包含N个不同整数的数组。编写一个程序,检查这个数组是否按逆时针排序并旋转了。已排序的数组不被视为被排序和旋转,即至少应该进行一次旋转。
示例 :
输入 :arr[] = {3, 4, 5, 1, 2}
输出 :YES
上述数组已经排序并旋转。
排序后的数组:{1, 2, 3, 4, 5}。
将这个排序好的数组顺时针旋转3个位置,我们得到:{3, 4, 5, 1, 2}
输入 :arr[] = {7, 9, 11, 12, 5}
输出 :YES
输入 :arr[] = {1, 2, 3}
输出 :NO
输入 :arr[] = {3, 4, 6, 1, 2, 5}
输出 :NO
方法 :
- 找到数组中的最小元素。
- 如果数组已排序并旋转,则将最小元素之前的所有元素都是递增顺序,最小元素之后的所有元素也是递增顺序。
- 检查最小元素之前的所有元素是否是递增顺序。
- 检查最小元素之后的所有元素是否是递增顺序。
- 检查数组的最后一个元素是否小于起始元素。
- 如果上述三个条件均满足,则输出 YES , 否则输出 NO 。
下面是上述思路的实现:
输出
时间复杂度: O(N),其中N表示给定数组的大小。
辅助空间: O(1),不需要额外的空间,因此是一个常数。
Approach Name: 线性搜索
Steps:
- 遍历数组从第二个元素到最后一个元素,并检查当前元素是否小于前一个元素。如果是,则数组旋转了。
- 如果数组旋转了,则找到数组中最小元素的索引。这可以通过再次遍历数组并跟踪最小元素及其索引来完成。
- 非降序比较元素,从最小元素开始循环比较到前一个元素。如果所有元素都是非降序的,则数组已排序和旋转。
输出
时间复杂度:O(n),其中n是输入数组的大小。
辅助空间:O(1)