• 【LeetCode】Find Minimum in Rotated Sorted Array 解题报告


    今天看到LeetCode OJ题目下方多了“Show Tags”功能。我觉着挺好,方便刚開始学习的人分类练习。同一时候也是解题时的思路提示。

    【题目】

    Suppose a sorted array is rotated at some pivot unknown to you beforehand.

    (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

    Find the minimum element.

    You may assume no duplicate exists in the array.

    【解法】

    题目比較简单,直接看代码吧,可是要想把代码写得美丽并不easy啊。

    O(n)非常好写,O(lgn)要好好捋捋思路。

    public class Solution {
        // O(n) simple
        public int findMin1(int[] num) {
            int len = num.length;
            if (len == 1) {
                return num[0];
            }
            
            for (int i = 1; i < len; i++) {
                if (num[i] < num[i-1]) {
                    return num[i];
                }
            }
            
            return num[0];
            
            // 尼玛,看成找中间数了
            // if (len % 2 != 0) { //len is odd
            //     return num[(begin+len/2)%len];
            // } else {    //len is even
            //     return (num[(begin+len/2-1)%len] + num[(begin+len/2)%len]) / 2;
            // }
        }
        
        
        // O(lgn) not that good
        public int findMin2(int[] num) {
            int len = num.length;
            if (len == 1) return num[0];
            
            int left = 0, right = len-1;
            while (left < right) {
                if ((right-left) == 1) return Math.min(num[left], num[right]);
                
                if (num[left] <= num[right]) return num[left];
                
                int mid = (left + right) / 2;
                if (num[mid] < num[right]) {
                    right = mid;
                } else if (num[left] < num[mid]) {
                    left = mid;
                }
            }
            
            return num[left];
        }
        
        
        // O(lgn) optimized iteratively
        public int findMin3(int[] num) {
            int len = num.length;
            if (len == 1) return num[0];
            int left = 0, right = len-1;
            while (num[left] > num[right]) { // good idea
                int mid = (left + right) / 2;
                if (num[mid] > num[right]) {
                    left = mid + 1;
                } else {
                    right = mid; // be careful, not mid-1, as num[mid] maybe the minimum
                }
            }
            return num[left];
        }
        
        
        // O(lgn) optimized recursively
        public int findMin(int[] num) {
            return find(num, 0, num.length-1);
        }
        
        public int find(int[] num, int left, int right) {
            if (num[left] <= num[right]) {
                return num[left];
            }
            int mid = (left + right) / 2;
            if (num[mid] > num[right]) {
                return find(num, mid+1, right);
            }
            return find(num, left, mid);
        }
    }


  • 相关阅读:
    Go学习2-切片
    Go学习1-MOD
    lua学习之逻辑运算符not,and,or
    google protobuf c++ 反射
    我要谴责一下,你们复制别人的答案好歹仔细看看
    远程登录redis
    openssl进行RSA加解密(C++)
    linux通过进程名查看其占用端口
    简体字丶冯|服务网关kong-docker安装
    简体字冯|docker-安装docker私有库
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7281508.html
Copyright © 2020-2023  润新知