2021-08-03leetcode刷題

編寫一個高效的算法來判斷 m x n 矩陣中蒋搜,是否存在一個目標值。該矩陣具有如下特性:每行中的整數(shù)從左到右按升序排列判莉。
每行的第一個整數(shù)大于前一行的最后一個整數(shù)豆挽。

def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m,n=len(matrix),len(matrix[0])
        m_l,m_r=0,m-1
        n_l,n_r=0,n-1
        #m_m=0
        while m_l<m_r:
            m_m=(m_l+m_r)//2
            if matrix[m_m][-1]==target:
                return True
            elif matrix[m_m][-1]<target:
                m_l=m_m+1
            else:
                m_r=m_m
        while n_l<n_r:
            n_m=(n_l+n_r)//2
            if matrix[m_l][n_m]==target:
                return True
            elif matrix[m_l][n_m]<target:
                n_l=n_m+1
            else:
                n_r=n_m-1
        return True if matrix[m_l][n_l]==target else False
image.png

下面的題與標解相差較大

整數(shù)數(shù)組 nums 按升序排列,數(shù)組中的值 互不相同 券盅。
在傳遞給函數(shù)之前帮哈,nums 在預(yù)先未知的某個下標 k(0 <= k < nums.length)上進行了 旋轉(zhuǎn),使數(shù)組變?yōu)?[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下標 從 0 開始 計數(shù))锰镀。例如娘侍, [0,1,2,4,5,6,7] 在下標 3 處經(jīng)旋轉(zhuǎn)后可能變?yōu)?[4,5,6,7,0,1,2] 。
給你 旋轉(zhuǎn)后 的數(shù)組 nums 和一個整數(shù) target 泳炉,如果 nums 中存在這個目標值 target 憾筏,則返回它的下標,否則返回 -1 花鹅。

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left,right=0,len(nums)-1
        while left<right:
            mid=(left+right)//2
            if nums[mid]>nums[left]:
                if nums[mid]<target:
                    left=mid+1
                elif nums[mid]==target:
                    return mid
                else:
                    
                    if nums[left]>target:
                        left=mid+1
                    elif nums[left]==target:
                        return left
                    else:
                        right=mid-1
            else:
                if nums[mid]==nums[left]:
                    ans=left if nums[left]==target else -1
                    ans =right if nums[right]==target else ans
                    #print(left,right)
                    return  ans

                if nums[mid]>target:
                    right=mid-1
                elif nums[mid]==target:
                    return mid
                else:
                    if nums[right]>target:
                        left=mid+1
                    elif nums[right]==target:
                        return right
                    else:
                        right=mid-1
            '''
            if nums[mid]<target and nums[left]:
                left=mid+1
            elif nums[mid]==target:
                return mid
            else:
                if nums[left]<target:
                    right=mid-1
                elif nums[left]==target:
                    return left
                else:
                    left=mid+1
            '''
        ans=left if nums[left]==target else -1
        ans =right if nums[right]==target else ans
        #print(left,right)
        return  ans
image.png

標解

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        if not nums:
            return -1
        l, r = 0, len(nums) - 1
        while l <= r:
            mid = (l + r) // 2
            if nums[mid] == target:
                return mid
            if nums[0] <= nums[mid]:
                if nums[0] <= target < nums[mid]:
                    r = mid - 1
                else:
                    l = mid + 1
            else:
                if nums[mid] < target <= nums[len(nums) - 1]:
                    l = mid + 1
                else:
                    r = mid - 1
        return -1

作者:LeetCode-Solution
鏈接:https://leetcode-cn.com/problems/search-in-rotated-sorted-
array/solution/sou-suo-xuan-zhuan-pai-xu-shu-zu-by-leetcode-solut/
來源:力扣(LeetCode)
著作權(quán)歸作者所有氧腰。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處刨肃。

對深入理解二分有幫助

給定一個按照升序排列的整數(shù)數(shù)組 nums古拴,和一個目標值 target。找出給定目標值在數(shù)組中的開始位置和結(jié)束位置真友。
如果數(shù)組中不存在目標值 target黄痪,返回 [-1, -1]。

class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        if len(nums)==0:
            return [-1,-1]
        left,right=0,len(nums)-1
        for i in range(2):
            tl,tr=0,right
            while tl<tr:
                mid=(tl+tr)//2 if i==0 else (tl+tr+1)//2
                #mid=(tl+tr)//2
                if nums[mid]==target:
                    if i==0:
                        #print('0 {}'.format(mid))
                        tr=mid
                    else:
                        #print('1 {}'.format(mid))
                        tl=mid
                elif nums[mid]>target:
                    tr=mid-1
                else:
                    tl=mid+1
                
            if i==0:
                left=tl
            else:
                #print("hi")
                right=tr 
        return [left,right] if nums[left]==target else [-1,-1]

關(guān)于優(yōu)化時間復(fù)雜度和空間復(fù)雜度的想法

class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        #cost.append(0)
        #ans,n=cost[:2],len(cost)
        a,b=cost[:2]
        n=len(cost)
        for i in cost[2:]:
            a,b=b,min(a,b)+i
        return min(a,b)


image.png

已知一個長度為 n 的數(shù)組盔然,預(yù)先按照升序排列桅打,經(jīng)由 1 到 n 次 旋轉(zhuǎn) 后,得到輸入數(shù)組愈案。例如挺尾,原數(shù)組 nums = [0,1,2,4,5,6,7] 在變化后可能得到:
若旋轉(zhuǎn) 4 次,則可以得到 [4,5,6,7,0,1,2]
若旋轉(zhuǎn) 7 次刻帚,則可以得到 [0,1,2,4,5,6,7]
注意潦嘶,數(shù)組 [a[0], a[1], a[2], ..., a[n-1]] 旋轉(zhuǎn)一次 的結(jié)果為數(shù)組 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。
給你一個元素值 互不相同 的數(shù)組 nums ,它原來是一個升序排列的數(shù)組掂僵,并按上述情形進行了多次旋轉(zhuǎn)航厚。請你找出并返回數(shù)組中的 最小元素 。

class Solution:
    def findMin(self, nums: List[int]) -> int:
        left,right=0,len(nums)-1
        if nums[-1]>=nums[0]:
            return nums[0]
        while left<right:
            mid=(left+right)//2
            if nums[mid]<nums[0]:
                right=mid
            else:
                left=mid+1
        return nums[left]
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锰蓬,一起剝皮案震驚了整個濱河市幔睬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芹扭,老刑警劉巖麻顶,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舱卡,居然都是意外死亡辅肾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門轮锥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矫钓,“玉大人,你說我怎么就攤上這事舍杜⌒履龋” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵既绩,是天一觀的道長概龄。 經(jīng)常有香客問我,道長饲握,這世上最難降的妖魔是什么私杜? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮互拾,結(jié)果婚禮上歪今,老公的妹妹穿的比我還像新娘。我一直安慰自己颜矿,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布嫉晶。 她就那樣靜靜地躺著骑疆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪替废。 梳的紋絲不亂的頭發(fā)上箍铭,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音椎镣,去河邊找鬼诈火。 笑死,一個胖子當著我的面吹牛状答,可吹牛的內(nèi)容都是我干的冷守。 我是一名探鬼主播刀崖,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拍摇!你這毒婦竟也來了亮钦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤充活,失蹤者是張志新(化名)和其女友劉穎蜂莉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體混卵,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡映穗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了幕随。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片男公。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖合陵,靈堂內(nèi)的尸體忽然破棺而出枢赔,到底是詐尸還是另有隱情,我是刑警寧澤拥知,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布踏拜,位于F島的核電站,受9級特大地震影響低剔,放射性物質(zhì)發(fā)生泄漏速梗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一襟齿、第九天 我趴在偏房一處隱蔽的房頂上張望姻锁。 院中可真熱鬧,春花似錦猜欺、人聲如沸位隶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涧黄。三九已至,卻和暖如春赋荆,著一層夾襖步出監(jiān)牢的瞬間笋妥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工窄潭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留春宣,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像月帝,于是被迫代替她去往敵國和親躏惋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容