初學python的我開始Leetcode題11-2

提示:100道LeetCode熱題-11-1主要是二分查找相關,包括三題:搜索旋轉排序數組、尋找旋轉排序數組中的最小值、尋找兩個正序數組的中位數。由于初學,所以我的代碼部分僅供參考。


前言

上次的三道二分查找題較為基礎,主要是回顧和簡單運用二分查找這一常見方法,這次的稍加了難度,大家一起看看吧~o(* ̄▽ ̄*)ブ


提示:以下是本篇文章正文內容,下面結果代碼僅供參考

題目1:搜索旋轉排序數組

1.題目要求:

題目如下:

整數數組?nums?按升序排列,數組中的值?互不相同?。

在傳遞給函數之前,nums?在預先未知的某個下標?k0 <= k < nums.length)上進行了?旋轉,使數組變為?[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下標?從 0 開始?計數)。例如,?[0,1,2,4,5,6,7]?在下標?3?處經旋轉后可能變為?[4,5,6,7,0,1,2]?。

給你?旋轉后?的數組?nums?和一個整數?target?,如果?nums?中存在這個目標值?target?,則返回它的下標,否則返回?-1?。

你必須設計一個時間復雜度為?O(log n)?的算法解決此問題。

示例 1:

輸入:nums = [
4,5,6,7,0,1,2]
, target = 0
輸出:4

示例?2:

輸入:nums = [
4,5,6,7,0,1,2]
, target = 3
輸出:-1

示例 3:

輸入:nums = [1], target = 0
輸出:-1

提示:

  • 1 <= nums.length <= 5000

  • -10^{4} <= nums[i] <= 10^{4}

  • nums?中的每個值都?獨一無二

  • 題目數據保證?nums?在預先未知的某個下標上進行了旋轉

  • -10^{4} <= target <= 10^{4}

代碼框架已經提供如下:

class Solution(object):

? ? def search(self, nums, target):

? ? ? ? """

? ? ? ? :type nums: List[int]

? ? ? ? :type target: int

? ? ? ? :rtype: int

? ? ? ? """

2.結果代碼:

class Solution(object):def search(self, nums, target):""":type nums: List[int]:type target: int:rtype: int"""left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] == target:return mid# 左半部分有序if nums[left] <= nums[mid]:if nums[left] <= target < nums[mid]:right = mid - 1else:left = mid + 1# 右半部分有序else:if nums[mid] < target <= nums[right]:left = mid + 1else:right = mid - 1return -1

說明:

本題還算基礎,為下一題做準備。由于每次都將搜索范圍縮小一半,時間復雜度為?O(log n),滿足題目要求。

  1. ??初始化指針??:left?和?right?分別指向數組的起始和結束位置。
  2. ??二分查找??:
    • 計算?mid?位置。
    • 如果?nums[mid]?等于?target,直接返回?mid
    • 判斷左半部分是否有序:
      • 如果?nums[left] <= nums[mid],說明左半部分有序。
        • 如果?target?在?[nums[left], nums[mid])?范圍內,則在左半部分繼續查找(調整?right)。
        • 否則在右半部分查找(調整?left)。
      • 如果右半部分有序:
        • 如果?target?在?(nums[mid], nums[right]]?范圍內,則在右半部分繼續查找(調整?left)。
        • 否則在左半部分查找(調整?right)。
  3. ??未找到目標??:如果循環結束仍未找到?target,返回?-1

題目2:尋找旋轉排序數組中的最小值

1.題目要求:

題目如下:

已知一個長度為?n?的數組,預先按照升序排列,經由?1?到?n?次?旋轉?后,得到輸入數組。例如,原數組?nums = [0,1,2,4,5,6,7]?在變化后可能得到:

  • 若旋轉?4?次,則可以得到?[4,5,6,7,0,1,2]
  • 若旋轉?7?次,則可以得到?[0,1,2,4,5,6,7]

注意,數組?[a[0], a[1], a[2], ..., a[n-1]]?旋轉一次?的結果為數組?[a[n-1], a[0], a[1], a[2], ..., a[n-2]]?。

給你一個元素值?互不相同?的數組?nums?,它原來是一個升序排列的數組,并按上述情形進行了多次旋轉。請你找出并返回數組中的?最小元素?。

你必須設計一個時間復雜度為?O(log n)?的算法解決此問題。

示例 1:

輸入:nums = [3,4,5,1,2]
輸出:1
解釋:原數組為 [1,2,3,4,5] ,旋轉 3 次得到輸入數組。

示例 2:

輸入:nums = [4,5,6,7,0,1,2]
輸出:0
解釋:原數組為 [0,1,2,4,5,6,7] ,旋轉 4 次得到輸入數組。

示例 3:

輸入:nums = [11,13,15,17]
輸出:11
解釋:原數組為 [11,13,15,17] ,旋轉 4 次得到輸入數組。

提示:

  • n == nums.length

  • 1 <= n <= 5000

  • -5000 <= nums[i] <= 5000

  • nums?中的所有整數?互不相同

  • nums?原來是一個升序排序的數組,并進行了?1?至?n?次旋轉

代碼框架已經提供如下:

class Solution(object):

? ? def findMin(self, nums):

? ? ? ? """

? ? ? ? :type nums: List[int]

? ? ? ? :rtype: int

? ? ? ? """

2.結果代碼:

class Solution(object):def findMin(self, nums):""":type nums: List[int]:rtype: int"""left, right = 0, len(nums) - 1while left < right:mid = (left + right) // 2if nums[mid] < nums[right]:right = midelse:left = mid + 1return nums[left]

說明:

我們需要在一個旋轉后的有序數組中查找最小值。旋轉后的數組不再是全局有序的,但可以被分成兩個有序的子數組。例如,[4,5,6,7,0,1,2]?是由?[0,1,2,4,5,6,7]?旋轉得到的,分為?[4,5,6,7]?和?[0,1,2]?兩個有序部分,最小值?0?位于兩個子數組的交界處。

由于數組是部分有序的,我們可以利用二分查找的思想,通過比較中間元素與右邊界元素的大小關系來判斷最小值的位置。具體步驟如下:

  1. ??初始化指針??:設置?left?和?right?分別指向數組的起始和結束位置。
  2. ??二分查找??:
    • 計算中間位置?mid
    • 如果?nums[mid] < nums[right],說明最小值在左半部分或就是?mid?本身,因此更新?right = mid
    • 否則,最小值在右半部分,更新?left = mid + 1
  3. ??終止條件??:當?left == right?時,nums[left]?即為最小值。

題目3:尋找兩個正序數組的中位數

1.題目要求:

題目如下:

給定兩個大小分別為?m?和?n?的正序(從小到大)數組?nums1?和?nums2。請你找出并返回這兩個正序數組的?中位數?。

算法的時間復雜度應該為?O(log (m+n))?。

示例 1:

輸入:nums1 = [1,3], nums2 = [2]
輸出:2.00000
解釋:合并數組 = [1,2,3] ,中位數 2

示例 2:

輸入:nums1 = [1,2], nums2 = [3,4]
輸出:2.50000
解釋:合并數組 = [1,2,3,4] ,中位數 (2 + 3) / 2 = 2.5

提示:

  • nums1.length == m

  • nums2.length == n

  • 0 <= m <= 1000

  • 0 <= n <= 1000

  • 1 <= m + n <= 2000

  • -10^{6} <= nums1[i], nums2[i] <=?10^{6}

代碼框架已經提供如下:

class Solution(object):

? ? def findMedianSortedArrays(self, nums1, nums2):

? ? ? ? """

? ? ? ? :type nums1: List[int]

? ? ? ? :type nums2: List[int]

? ? ? ? :rtype: float

? ? ? ? """

2.結果代碼:

class Solution(object):def findMedianSortedArrays(self, nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: float"""if len(nums1) > len(nums2):nums1, nums2 = nums2, nums1m, n = len(nums1), len(nums2)total_len = m + nhalf_len = (total_len + 1) // 2low, high = 0, mwhile low <= high:i = (low + high) // 2j = half_len - imax_left1 = nums1[i-1] if i > 0 else float('-inf')min_right1 = nums1[i] if i < m else float('inf')max_left2 = nums2[j-1] if j > 0 else float('-inf')min_right2 = nums2[j] if j < n else float('inf')if max_left1 <= min_right2 and max_left2 <= min_right1:if total_len % 2 == 1:return max(max_left1, max_left2)else:return (max(max_left1, max_left2) + min(min_right1, min_right2)) / 2.0elif max_left1 > min_right2:high = i - 1else:low = i + 1return 0.0

問題分析:

我們需要在兩個有序數組?nums1?和?nums2?中找到合并后的中位數。中位數的定義是將數組分成兩部分,左半部分的所有元素小于等于右半部分的所有元素。如果合并后的數組長度為奇數,中位數是中間的那個數;如果長度為偶數,中位數是中間兩個數的平均值。題目要求算法的時間復雜度為?O(log(m+n)),這意味著我們需要使用二分查找的思想來解決這個問題。

解決思路:

為了滿足時間復雜度要求,我們可以利用二分查找的思想,通過每次排除一半的元素來縮小搜索范圍。具體步驟如下:

  1. ??確定中位數的位置??:根據合并后數組的總長度?total_length = m + n,如果?total_length?是奇數,中位數是第?k = (total_length + 1) // 2?小的元素;如果是偶數,中位數是第?k1 = total_length // 2?和第?k2 = k1 + 1?小的元素的平均值。
  2. ??二分查找第 k 小的元素??:
    • 比較?nums1?和?nums2?中第?k//2?小的元素(如果數組長度不足?k//2,則取最后一個元素)。
    • 如果?nums1?的第?k//2?小的元素小于?nums2?的第?k//2?小的元素,說明?nums1?的前?k//2?個元素不可能是第?k?小的元素,可以排除這部分元素,并更新?k?為?k - k//2
    • 反之,排除?nums2?的前?k//2?個元素。
    • 重復上述過程,直到?k?為 1 或其中一個數組被完全排除。
  3. ??處理邊界條件??:
    • 如果一個數組為空,直接返回另一個數組的第?k?小的元素。
    • 如果?k?為 1,返回兩個數組當前指針位置的較小值。

優化點說明:

  1. ??減少冗余計算??:

    • 直接交換?nums1?和?nums2,確保?nums1?是較短的數組,減少二分查找的范圍。
    • 使用?half_len?直接計算中位數的位置,避免重復計算。
  2. ??提前終止??:

    • 在二分查找中,一旦找到滿足條件的分割點,立即返回結果,減少不必要的迭代。
  3. ??邊界處理優化??:

    • 使用?float('-inf')?和?float('inf')?處理邊界情況,避免復雜的條件判斷。


總結

針對二分查找的三種題型進行了學習,了解了部分有關二分查找與python的相關知識,大家加油!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89769.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89769.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89769.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python 數據分析與可視化 Day 12 - 建模前準備與數據集拆分

? 今日目標 掌握建模前常見準備步驟學會使用 train_test_split() 將數據劃分為訓練集和測試集理解特征&#xff08;X&#xff09;與標簽&#xff08;y&#xff09;的區分學習常見建模流程的輸入要求&#xff08;格式、維度&#xff09;&#x1f4d8; 一、建模前準備流程概覽 數…

Swagger 安裝使用教程

一、Swagger 簡介 Swagger 是一套開放源代碼的 API 文檔生成工具鏈&#xff0c;現歸屬于 OpenAPI 規范。它支持 RESTful API 的定義、生成、測試和文檔自動化。常見的使用工具包括 Swagger UI、Swagger Editor、Swagger Codegen 以及 SpringFox&#xff08;Spring 集成庫&…

【seismic unix相速度分析-頻散曲線】

介紹Seismic Unix Seismic Unix&#xff08;SU&#xff09;是一個開源的地震數據處理軟件包&#xff0c;主要用于地震數據的處理、分析和可視化。它由科羅拉多礦業學院的Center for Wave Phenomena開發&#xff0c;廣泛應用于學術研究和工業領域。SU提供了一系列命令行工具&am…

3.前端和后端參數不一致,后端接不到數據的解決方案

目錄 1.問題背景: (1).前端代碼: (2).后端代碼: (3).問題分析: [1]前端參數構造錯誤: [2].Api請求配置錯誤: 2.解決方案 (1).修改 role.js 中的 API 方法 (2).前端組件中的調用方式改成下面的而不是繼續拼接了 3.總結: 1.問題背景: 我在接口開發過程中&#xff0c;前…

SpringBoot:整合quartz實現定時任務-MisFire的處理

文章目錄 一、什么是MisFire二、MisFire發生的情況三、MisFire的補償策略四、代碼實現 一、什么是MisFire 簡單理解為&#xff1a;定時任務&#xff0c;所錯過的觸發 二、MisFire發生的情況 1、資源緊張&#xff0c;定時任務請求不到對應的線程。 2、調度器關閉。 3、設置定…

返回json,優雅處理轉換(如 0.85 → “85.00%“)

核心解決方案 通過 自定義序列化器 JsonSerialize 注解&#xff0c;實現 BigDecimal 到百分比字符串的自動轉換。 1.1 自定義序列化器代碼 java import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterx…

大語言模型LLM在訓練/推理時的padding

討論的是在訓練大型語言模型&#xff08;Transformer-based models&#xff0c;比如GPT等&#xff09;時&#xff0c;文本序列的填充&#xff08;padding&#xff09;問題&#xff0c;即訓練和推理時分辨填充在序列的左側&#xff08;left padding&#xff09;或右側&#xff0…

50 個常用 Docker 命令

1. Docker 基礎命令 查看 Docker 版本 docker --version查看 Docker 運行狀態 systemctl status docker查看 Docker 信息 docker info查看幫助信息 docker help2. 鏡像管理 拉取鏡像 docker pull <鏡像名>查看本地鏡像 docker images刪除鏡像 docker rmi <鏡…

紋理貼圖算法研究論文綜述

紋理貼圖&#xff08;Texture Mapping&#xff09;是計算機圖形學和計算機視覺中的核心技術&#xff0c;廣泛應用于三維重建、游戲渲染、虛擬現實&#xff08;VR&#xff09;、增強現實&#xff08;AR&#xff09;等領域。對其算法的研究涵蓋了紋理生成、映射、縫合、優化等多個…

關于使用cursor tunnel鏈接vscode(避免1006 issue的做法)

詳細步驟 第 1 步&#xff1a;在你的本地機器上準備好 Cursor 這一步很簡單&#xff0c;你可能已經完成了。只需確保你的本地電腦上已經安裝了 Cursor 桌面應用程序。 要做的事&#xff1a;無&#xff0c;只需確保 Cursor 已安裝。 第 2 步&#xff1a;在遠程服務器上安裝 Curs…

Redis常見性能問題和解決方案有哪些

Redis 作為高性能的內存數據庫&#xff0c;在電商等高并發場景中廣泛使用&#xff0c;但可能因配置、使用不當或環境限制出現性能問題。以下是 Redis 常見的性能問題及其解決方案&#xff0c;結合電商場景&#xff0c;用中文簡潔說明&#xff1a;### 1. **高延遲&#xff08;響…

明遠智睿RK3588:創新了高性能,讓顧慮煙消云散

在科技浪潮的推動下&#xff0c;高性能開發已經成為眾多行業發展的核心驅動力。從智能交通的車路協同&#xff0c;到醫療領域的影像診斷&#xff1b;從智能家居的智能控制&#xff0c;到工業互聯網的智能制造&#xff0c;每一個領域都對模塊的性能提出了極高的要求。然而&#…

I Data Lab

萬事開頭難&#xff0c;尤其是和 0 與 1 打交道&#xff0c;和后面的實驗相比&#xff0c;這次只能算個熱身。但是喜歡運動的都知道&#xff0c;熱身很重要&#xff01;任務目標我們先來看看 Datalab 需要我們做什么。主要是通過這次的作業來熟悉整型及浮點數的位表達形式&…

SQLite 安裝使用教程

一、SQLite 簡介 SQLite 是一個輕量級的關系型數據庫管理系統&#xff0c;嵌入式、零配置、無需安裝服務器&#xff0c;廣泛應用于移動端開發&#xff08;如 Android&#xff09;、桌面應用、小型網站等場景。 二、下載安裝 2.1 官方網站下載 訪問 SQLite 官網 下載適用于操…

Python-Word文檔、PPT、PDF以及Pillow處理圖像詳解

Python操作Word和PowerPoint文件操作Word文檔命令來安裝python-docx三方庫。pip install python-docxfrom docx import Document from docx.shared import Inches, Pt, RGBColor from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.enum.table import WD_TABLE_ALIGNMEN…

高可擴展屬性建模設計:架構師的全局思考與落地方案

在復雜業務系統中&#xff0c;動態屬性擴展始終是架構設計的核心難題之一。傳統方案如寬表設計和EAV&#xff08;實體-屬性-值&#xff09;模型分別在性能與擴展性上各有優勢與劣勢&#xff0c;但也都有明顯局限。 為了兼顧性能、擴展性、維護成本&#xff0c;需要引入更靈活的…

數據結構入門:鏈表

鏈式存儲結構通過使用指針將分散的存儲單元鏈接起來&#xff0c;每個元素由數據部分和指針部分組成。 鏈式表的定義和特點 鏈式表的每個節點包含兩個部分&#xff1a; 數據域&#xff1a;存儲數據元素。指針域&#xff1a;存儲下一個節點的內存地址。 鏈式表的頭指針指向第一個…

達夢數據庫DMHS介紹及安裝部署

目錄 概述 安裝規劃 安裝步驟 上傳安裝包 更改權限 執行安裝命令 源端和目的端處理 開啟歸檔 開啟邏輯日志 創建測試表 生成測試數據 配置目的端文件 配置源端文件 啟動目的端 啟動源端 裝載數據 源端開啟cpt模塊 數據同步驗證 隨機數據驗證 概述 達夢數據實時同…

BERT 模型詳解:結構、原理解析

前言 在自然語言處理&#xff08;NLP&#xff09;領域&#xff0c;BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;已經成為理解類任務的標配模型。相比 GPT 更擅長文本生成&#xff0c;BERT 則在語言理解任務上展現出卓越的能力。本文…

一、bfv_basics

目錄 一、加密參數 EncryptionParameters類1. 三個重要的參數2. 參數的作用3. 同態加密方案4. 多項式模數的度 poly_modulus_degree (n)5. 密文模數 coeff_modulus (q)6. 明文模數 plain_modulus (t&#xff0c;這是 BFV 方案才有的&#xff0c;CKKS 沒有) 二、上下文 SEALCont…