今�Hの国の呵呵君: [Algorithm]Find Minimum in Rotated Sorted Array(sorted as from max to min)



今�Hの国の呵呵君: [Algorithm]Find Minimum in Rotated Sorted Array(sorted as from max to min)

[Algorithm]Find Minimum in Rotated Sorted Array(sorted as from max to min)


在原题Find Minimum in Rotated Sorted Array中,array的顺序是从小到大的。这次我们把array的顺序改成从大到小,解法会发生什么变化吗?通过这一题,我们会总结二分法边界条件的相关问题。
这一题的分析思路是和原题是一样的,同样为了代码的简洁我们比较A[lo]和A[mid]:
  • 如果A[mid] < A[lo],那么[lo, mid]是sorted的,minimum只可能在[mid, hi]区间里。
  • 如果A[mid] < A[lo],那么[mid, hi]不是sorted的,minimum只可能在[lo, mid)区间里。
所以如果A[mid] < A[lo],我们更新lo = mid;如果A[mid] < A[lo] 我们更新hi = mid - 1。但是随之而来的问题就是和原题不同,当我们把lo复制为mid的时候,当hi == lo  + 1的时候,二分就无法向下进行了,因为mid会一直等于lo。所以这个时候当hi <= lo + 1的时候我们就应该跳出,然后找lo和hi中较小的那一个。
分析到这里,我们可以看出,当二分的策略不同的时候,边界条件也是不同的,具体总结如下:
  • [lo, hi] -> [lo, mid) + (mid, hi],这个时候每次更新的时候lo = mid + 1,hi = mid - 1,跳出的条件至少应该是lo > hi
  • [lo, hi] -> [lo, mid] + (mid, hi],这个时候每次更新的时候lo = mid + 1,hi = mid,跳出的条件至少应该是lo >= hi,若条件为lo >= hi,跳出的时候情况为lo == hi
  • [lo, hi] -> [lo, mid) + [mid, hi],这个时候每次更新的时候lo = mid,hi = mid - 1,跳出的条件至少应该是lo + 1 >= hi,若条件为lo  + 1  >= hi,跳出的时候情况为lo == hi 或者 lo + 1 == hi
  • [lo, hi] -> [lo, mid) + (mid, hi],这个时候每次更新的时候lo = mid,hi = mid,跳出的条件至少应该是lo + 1 >= hi,若条件为lo  + 1  >= hi,跳出的时候情况为 lo + 1 == hi

Read full article from 今�Hの国の呵呵君: [Algorithm]Find Minimum in Rotated Sorted Array(sorted as from max to min)


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts