zoukankan      html  css  js  c++  java
  • 二分查找总结及部分Lintcode题目分析 3

    Search in rotated sorted array,题目中也给出了相应的例子,就是在sorted array某个节点发生了翻转(ie.0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2)。所以我们可以把这个sorted array 分成两部分看,一部分是左半部分的上升区间,然后是最小值,一部分是右半部分的上升区间。以及考虑其中的特例就是翻转后仍是原来的array,一个连续的上升区间。

    1. Find Minimum in Rotated Sorted Array

    解题思路:要找到最小值的话,首先要定一个参考的值,即target是什么。我们以数组尾作为target,来进行比较,先锁定是右半部分的上升区间,再在这个上升区间中找最小值。找到比num[end]的值要小的不返回而是进一步缩小范围。

    class Solution:
        # @param num: a rotated sorted array
        # @return: the minimum number in the array
        def findMin(self, num):
            # set the last element as target, and find the second ascending period
            start = 0
            end = len(num) - 1
            while start + 1 < end:
                mid = start + (end - start) / 2
                if num[mid] <= num[end]:
                    end = mid
                else:
                    start = mid
            return min(num[start],num[end])
    

    2. Search in rotated sorted array

    这道题据说是检验你是否真的会二分法的题目~因为target已经给出了,那我们的判断标准就比之前找最小值要多了个判断。以target和end的比较,target和mid的比较,以及这个mid落到了哪个上升区间来比较~

    class Solution:
        """
        @param A : a list of integers
        @param target : an integer to be searched
        @return : an integer
        """
        def search(self, A, target):
            if A is None or len(A) == 0:
                return -1
            start = 0
            end = len(A) - 1
            while (start + 1 < end):
                mid = start + (end - start) / 2
                if A[mid] == target:
                    return mid
                elif A[end] < A[mid]:
                    if A[end] < target and target <= A[mid]:
                        end = mid
                    else:
                        start = mid
                else:
                    if A[mid] <= target and target <= A[end]:
                        start = mid
                    else:
                        end = mid
            if A[end] == target:
                return end                    
            if A[start] == target:
                return start
            
            return -1
    
  • 相关阅读:
    解决javaScript在不同时区new Date()显示值不同问题
    页面返回上一页浏览位置
    如何disabled禁用所有表单input输入框元素
    js根据json数组多个字段排序
    No identifier specified for entity
    Android resource compilation failed
    android 系统dialog的应用
    android消息处理源码分析
    Linux下常用命令
    ContentProvider和ContentResolver的使用
  • 原文地址:https://www.cnblogs.com/chercher/p/5640019.html
Copyright © 2011-2022 走看看