• lintcode39


    Given a rotated sorted array, recover it to sorted array in-place.What is rotated array?
    * For example, the orginal array is [1,2,3,4], The rotated array of it can be [1,2,3,4], [2,3,4,1], [3,4,1,2], [4,1,2,3]
    Example
    [4, 5, 1, 2, 3] -> [1, 2, 3, 4, 5]
    Challenge
    In-place, O(1) extra space and O(n) time.
     
    三步反转法。
    1.用二分法找到断层处最低点a。
    2.反转[0,a-1],反转[a,end],反转[0,end]
     
    细节:
    算法复杂度O(n)。所以和面试官确认数组里有没有重复数字,如果有的话就直接用遍历法找最低点,二分的方法会有问题,反正不会增加时间复杂度。 
     
    我的实现
    public class Solution {
        /**
         * @param nums: An integer array
         * @return: nothing
         */
        public void recoverRotatedSortedArray(List<Integer> nums) {
            // write your code here
            if (nums == null || nums.size() < 2) {
                return;
            }
            int mark = findSmallestIndexWithDup(nums);
            reverseSubarray(nums, 0, mark - 1);
            reverseSubarray(nums, mark, nums.size() - 1);
            reverseSubarray(nums, 0, nums.size() - 1);
        }
        
        private int findSmallestIndexWithDup(List<Integer> nums) {
            for (int i = 1; i < nums.size(); i++) {
                if (nums.get(i - 1) > nums.get(i)) {
                    return i;
                }
            }
            return 0;
        }
        
        private void reverseSubarray(List<Integer> nums, int start, int end) {
            for (int i = start, j = end; i < j; i++, j--) {
                int temp = nums.get(i);
                nums.set(i, nums.get(j));
                nums.set(j, temp);
            }
        }
    }

    九章实现

    /**
    * 本参考程序来自九章算法,由 @九章算法 提供。版权所有,转发请注明出处。
    * - 九章算法致力于帮助更多中国人找到好的工作,教师团队均来自硅谷和国内的一线大公司在职工程师。
    * - 现有的面试培训课程包括:九章算法班,系统设计班,算法强化班,Java入门与基础算法班,Android 项目实战班,
    * - Big Data 项目实战班,算法面试高频题班, 动态规划专题班
    * - 更多详情请见官方网站:http://www.jiuzhang.com/?source=code
    */ 
    
    import java.util.ArrayList;
    
    
    public class Solution {
        /**
         * @param nums: The rotated sorted array
         * @return: The recovered sorted array
         */
        private void reverse(ArrayList<Integer> nums, int start, int end) {
            for (int 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(ArrayList<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;
                }
            }
        }
    }
  • 相关阅读:
    hdu 6702 ^&^ 位运算
    hdu 6709 Fishing Master 贪心
    hdu 6704 K-th occurrence 二分 ST表 后缀数组 主席树
    hdu 1423 Greatest Common Increasing Subsequence 最长公共上升子序列 LCIS
    hdu 5909 Tree Cutting FWT
    luogu P1588 丢失的牛 宽搜
    luogu P1003 铺地毯
    luogu P1104 生日
    luogu P1094 纪念品分组
    luogu P1093 奖学金
  • 原文地址:https://www.cnblogs.com/jasminemzy/p/9452678.html
Copyright © 2020-2023  润新知