zoukankan      html  css  js  c++  java
  • 【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);
        }
    }


  • 相关阅读:
    LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    C语言控制台窗体图形界面编程(总结)
    linux下c程序 daemon、fork与创建pthread的顺序问题
    内存动态分配与释放
    MyReport报表系统v1.2公布
    AutoLayout初战----Masonry与FDTemplateLayoutCell实践
    算法与数据结构题目的 PHP 实现:栈和队列 设计一个有 getMin 功能的栈
    药店从业者,不能不知的数据分析方法
    药店从业者,不能不知的数据分析方法
    SAS之大话PDV
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7281508.html
Copyright © 2011-2022 走看看