旋转数组

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 不存在重复元素

 

posted @ 2020-05-26 13:34  Ainsliaea  阅读(531)  评论(0编辑  收藏  举报