旋转数组
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 不存在重复元素