LeetCode專題-Python實現之第一題:Two Sum

来源:http://www.cnblogs.com/exploitht/archive/2017/09/22/7577354.html
-Advertisement-
Play Games

[導航頁 LeetCode專題 Python實現][1] [1]: http://www.cnblogs.com/exploitht/p/7488742.html 相關代碼已經上傳到github: "https://github.com/exploitht/leetcode python" 文中代碼 ...


導航頁-LeetCode專題-Python實現

相關代碼已經上傳到github:https://github.com/exploitht/leetcode-python
文中代碼為了不動官網提供的初始幾行代碼內容,有一些不規範的地方,比如函數名大小寫問題等等;更合理的代碼實現參考我的github repo

1、讀題

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

有一個整型數組,返回滿足特定條件的2個數字的索引,這2個數字相加的值等於特定的目標數字。假設每一次輸入都會有唯一的輸出而且同一個元素不會使用2次。

2、初步解題

很簡單的一個思路就是迴圈遍曆數組,做一個if判斷,滿足條件返回索引。編碼很簡單,如下:

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        # i從列表的第一個到倒數第二個,也就是nums[0, Len-2]
        # j從i的後面一個開始到nums[Len-1]
        # 下麵的len(nums)-1而不是-2是因為range(1,2)返回的是[1]不含2
        for i in range(0, len(nums) - 1):
            for j in range(i + 1, len(nums)):
                if nums[i] + nums[j] == target:
                    return [i, j]

3、第一次優化

上面的解決方案for套for明顯時間複雜度是O(n2),這裡的2是平方,空間複雜度是O(n),思考一下有沒有優化的辦法的?
迴圈有嵌套,能不能不要迴圈套迴圈?
這裡的迴圈嵌套是為了對每一個元素判斷一次序列中是否有匹配元素,有的話返回雙方索引,所以可以考慮在尋找匹配的元素這一步,不要一直去遍歷,如果元素值和索引生成一個哈希表,那麼匹配的過程只要查詢哈希表就行了,這個過程的複雜度是O(1),下麵嘗試給出一種解決方案:

class Solution(object):
    def twoSum(self, nums, target):
        num_dict = dict()
        # 第一次迴圈建立值和索引的哈希表
        for index, value in enumerate(nums):
            num_dict[value] = index
        # 第二次迴圈判斷目標target-nums里的元素得到的結果是不是在前面得到的字典中,如果存在則返回雙方索引
        for index, value in enumerate(nums):
            if (target - value) in num_dict and num_dict[target - value] != index:
                return [index, num_dict[target - value]]

4、第二次優化

上面一個方案通過2次迴圈(非嵌套)的方式,遍歷了2次nums列表得到了需要的結果,時間複雜度變成了O(n)。
美中不足的是迴圈還是進行了2次,這裡是先生成一個哈希表,然後迴圈過程中判斷當前元素和哈希表中的數據相加是否滿足條件,第一次迴圈的過程中能不能做一個判斷呢?
所以下一個思路是遍歷nums,遍歷過程中判斷當前元素和哈希表中的值相加能不能滿足要求,也就是target-當前元素的值在哈希表中是否存在,如果存在,就返回2個索引,如果不存在,那麼當前元素存入哈希表。實現如下:

class Solution(object):
    def twoSum(self, nums, target):
        num_dict = dict()
        for index, value in enumerate(nums):
            want = target - value
            if want in num_dict:
                return [num_dict[want], index]
            num_dict[value] = index

聲明:文章中涉及的代碼全部本地手寫然後上傳到leetcode驗證通過,優化部分思路參考官網內容


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近.NET Core升級到2.0後開始慢慢搗鼓的多了起來,但遇到了不少坑,所以特來記錄下。 第一個坑 條件編譯符 我們在編寫一些方法的時候通常會為Debug模式增加一些輸出日誌等以便我們檢查,也會為Release模式增加或修改一些特定的參數,但今天我在寫這些的時候就遇到了這個坑#if !DEBUG ...
  • 背水一戰 Windows 10 之 控制項(WebView): 對 WebView 中的內容截圖, 通過 Share Contract 分享 WebView 中的被選中的內容 ...
  • lintcode :First Unique Number In Stream ...
  • 近期,DataCamp發佈了jupyter notebook的 cheat sheet,【Python數據之道】第一時間與大家一起來分享下該cheat sheet的內容。 以下是該cheat sheet的部分內容: 各位小伙伴可以從DataCamp的網站獲取該cheat sheet的pdf版,當然, ...
  • 題目描述 如圖所示為某生態系統的食物網示意圖,據圖回答第1小題現在給你n個物種和m條能量流動關係,求其中的食物鏈條數。物種的名稱為從1到n編號M條能量流動關係形如a1 b1a2 b2a3 b3......am-1 bm-1am bm其中ai bi表示能量從物種ai流向物種bi,註意單獨的一種孤立生物 ...
  • 轉載請註明原創出處,謝謝! 因為每個鏈路都會對其性能造成影響,應該是 全鏈路的修改壓測 (ak大神經常說全鏈路!)。本次基本就是區域網,所以並沒有怎麼優化,其實也應該考慮進去的。 Linux系統參數層面的修改: 1. 修改可打開文件數和用戶最多可開發進程數 命令: 可以通過ulimit –a查看參數 ...
  • 一、雞湯 1.提高自我修養 2.人醜就要多讀書 3.多走走,開拓眼界 二、目錄: 1.列表、元組操作 2.字元串操作 3.字典操作 dict是無序的 key必須是唯一的 4.集合操作 集合是一個無序的,不重覆的數據組合,它的主要作用如下: 去重,把一個列表變成集合,就自動去重了 關係測試,測試兩組數 ...
  • 使用python爬去拉鉤數據 第一步:下載所需模塊 requests 進入cmd命令 :pip install requests 回車 聯網自動下載 xlwt 進入cmd命令 :pip install xlwt 回車 聯網自動下載 ... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...