39. recover rotated sorted array恢复旋转排序数组

一句话思路:从左边开始的三步翻转法

一刷报错:

  1. 不理解start.end是位置随机定义的。i,j是临时变量,为start,end服务
  2. nums.size()区别于nums.length:用于范形变量。作用于一堆。但是如果都是从0开始,-1的原理相同
  3. index可以在括号里定义
  4. if (nums.get(index) > nums.get(index + 1)),不是index++,前面也会变
  5. set是一个方法,不能直接用set,必须用nums.set
  6. index指向的前一个元素比较大的时候,才要替换

风格上:

  1. 一次定义一个变量:int a; 换行; int b

总结:start.end是位置随机定义的,什么地方都有可能是start.end

用到的English数据结构,trick or not:array arraylist(因为无序就没用二分法)

时间复杂度n:最多每个数挪一次,空间复杂度1:数组存储,所需的空间没变

public class Solution {
    /*
     * @param nums: An integer array
     * @return: nothing
     */
        // write your code here
        //reverse function
        private void reverse(List<Integer> nums, int start, int end) {
            int i;
            int j;
            for (i = start, j = end; i < j; i++, j--) {
                int temp = nums.get(i);
                nums.set(i, nums.get(j));
                nums.set(j, temp);
            }
        }
        
        public void recoverRotatedSortedArray(List<Integer> nums) {
            for (int index = 0; index < nums.size() - 1; index++) {
                if (nums.get(index) > nums.get(index + 1)) {
                reverse(nums, 0 , index);
                reverse(nums, index + 1, nums.size() - 1);
                reverse(nums, 0 , nums.size() - 1); 
                }
            }
            return;
        }
    }
View Code
原文地址:https://www.cnblogs.com/immiao0319/p/7898468.html