旋转数组
1. 如何实现旋转数组
https://leetcode.com/problems/rotate-array/
实现时间复杂度 O(n)、空间复杂度 O(1) 的解法
两种,一种是记录前一个位置,利用取余遍历一遍数组。会存在取余回到同一个位置的问题,利用变量 start 规避。
public void rotate(int[] nums, int k) {
if(nums == null || nums.length == 0){
return;
}
int start = 0;
int cur = nums[0];
int pre =cur;
int index = 0;
int len = nums.length;
for(int i = 0;i<len;i++){
pre = cur;
index = (index + k)%len;
cur = nums[index];
nums[index] = pre;
if(index == start){
index = ++start;
if(index < len){
cur = nums[index];
}else{
return;
}
}
}
}
第二种是三次反转,但是 k 要先对 len 取模,避免 k 大于 len 时多次反转的情况
2. 旋转数组最小值
https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/
public int findMin(int[] arr) {
if (arr == null || arr.length == 0) {
return -1;
}
int len = arr.length;
int l = 0;
int u = len - 1;
while (l < u) {
// while 处理重复元素的情况
while(arr[l] == arr[u] && l != u){
l++;
}
if(arr[l] <= arr[u]){
break;
}
int m = l + (u - l) / 2;
if (arr[m] > arr[u]) {
l = m + 1;
} else{
u = m;
}
}
return arr[l];
}
3. 旋转数组的查找
存在重复元素 vs 不存在重复元素

浙公网安备 33010602011771号