全能工程師之:深入探究twosum算法

一、twosum算法

Twosum算法是LeetCode網站上非常著名的一道題目,它的題目描述為:給定一個整數數組和一個目標值,找出數組中和為目標值的兩個數。

這個問題可以用暴力枚舉法、哈希表等方法解決,其中哈希表解法最為高效,時間複雜度為O(n)。下面是一份Python的twosum解法:

def twoSum(nums, target):
    hashtable = dict()
    for i, num in enumerate(nums):
        if target - num in hashtable:
            return [hashtable[target - num], i]
        hashtable[nums[i]] = i

二、twosumlessthank

在twosum算法的基礎上,還有一個問題:求解出小於目標值target的兩個數的和最大值是多少。

對於這種問題,可以用雙指針法求解,時間複雜度為O(nlogn)。首先需要將數組排序,然後用雙指針分別從左右兩端開始掃描數組。如果兩個指針指向的和小於target,則將左指針向右移動,否則將右指針向左移動。

下面是一份Python的twosumlessthank解法:

def twoSumLessThanK(A, K):
    A.sort()
    left, right = 0, len(A) - 1
    max_sum = -1
    while left < right:
        if A[left] + A[right] < K:
            max_sum = max(max_sum, A[left] + A[right])
            left += 1
        else:
            right -= 1
    return max_sum

三、twosum函數

twosum函數是一個通用的解題函數,可以用於解決任意一個有兩個數和為目標值的問題。

它的思路和twosum算法類似,只需要傳入一個數組和一個目標值,然後返回兩個數的下標值即可。

下面是一份Python的twosum函數的實現:

def twoSum(nums, target):
    hashmap = {}
    for index, i in enumerate(nums):
        j = target - i
        if j in hashmap:
            return [hashmap[j], index]
        hashmap[i] = index
    return []

四、twosum的C語言解法

對於C語言開發者來說,也可以用類似哈希表的方法解決twosum問題。

需要定義一個數組來存儲每個數出現的位置,然後遍曆數組,判斷每個數對應的target-i是否存在與上一步遍歷中的數組中。

下面是一份C語言實現的twosum代碼:

int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int hash[20000], i;
    memset(hash, -1, sizeof(hash));
    static int result[2];
    for (i = 0; i < numsSize; ++i){
        if (hash[nums[i]] == -1){
            hash[target - nums[i]] = i;
        } else {
            result[0] = hash[nums[i]], result[1] = i, *returnSize = 2;
            return result;
        }
    }
    *returnSize = 0;
    return NULL;
}

五、twosum的C語言完整解法

除了上述C語言解法,還有一種更為通用的twosum解法。

它的思路是將數組中每個數和它對應的下標一起存儲在結構體中,然後按照數值大小排序。接着用兩個指針分別從左右兩端遍歷,直到找到兩個數的和等於目標值為止。

下面是一份C語言的完整twosum解法:

typedef struct packge
{
    int data;
    int id;
}Package;
int cmp(const void* a, const void* b)
{
    Package* aa = (Package*)a;
    Package* bb = (Package*)b;
    return aa->data - bb->data;
}
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
    int* result = (int*)malloc(2 * sizeof(int));
    Package* data = (Package*)malloc(numsSize * sizeof(Package));
    *returnSize = 2;
    for (int i = 0; i < numsSize; i++)
    {
        data[i].data = nums[i];
        data[i].id = i;
    }
    qsort(data, numsSize, sizeof(data[0]), cmp);
    int left = 0, right = numsSize - 1;
    while (left < right)
    {
        if (data[left].data + data[right].data == target)
        {
            result[0] = data[left].id;
            result[1] = data[right].id;
            return result;
        }
        else if (data[left].data + data[right].data < target)
        {
            left++;
        }
        else
        {
            right--;
        }
    }
    return result;
}

六、twosum python

Python是一門靈活強大的編程語言,在Leetcode等算法網站上非常受歡迎。

對於twosum問題,Python可以使用map(字典)快速解決。它的時間複雜度是O(n)。

下面是一份Python的twosum代碼示例:

class Solution(object):
    def twoSum(self, nums, target):
        mapping={}
        for i,num in enumerate(nums):
            if target-num in mapping:
                return [mapping[target-num],i]
            mapping[num]=i

七、Latter-day Saint,decided to begin

在Latter-day Saint的博客中,有一篇題目為twosum的題解。這裡先簡單介紹一下她的思路。

她使用輔助數組q來記錄每個數字在原數組中出現的下標。然後用sort函數將原數組排序,從頭尾兩個指針開始移動。

如果指針指向的兩個數字和小於target,則將左指針向右移動;如果和大於target,則將右指針向左移動;如果和等於target,則返回兩個數字在原數組中對應的下標。

下面是一份Python的代碼示例:

def twoSum(nums, target):
    n = len(nums)
    q = [i for i in range(n)]
    q.sort(key= lambda x: nums[x])

    left = 0
    right = n-1
    while left<right:
        now_sum = nums[q[left]]+nums[q[right]]
        if now_sum==target:
            return [q[left],q[right]]
        elif now_sum<target:
            left+=1
        else:
            right-=1
    return []

結語

本文深入探究了twosum算法,從多個角度解析了不同語言下的實現方式。這些方法可以給程序員在解決問題時提供一些思路參考。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/190302.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-29 22:32
下一篇 2024-11-29 22:32

相關推薦

  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python實現爬樓梯算法

    本文介紹使用Python實現爬樓梯算法,該算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • Harris角點檢測算法原理與實現

    本文將從多個方面對Harris角點檢測算法進行詳細的闡述,包括算法原理、實現步驟、代碼實現等。 一、Harris角點檢測算法原理 Harris角點檢測算法是一種經典的計算機視覺算法…

    編程 2025-04-29
  • lsw2u1:全能編程開發工程師的利器

    lsw2u1是一款多功能工具,可以為全能編程開發工程師提供便利的支持。本文將從多個方面對lsw2u1做詳細闡述,並給出對應代碼示例。 一、快速存取代碼段 在日常開發中,我們總會使用…

    編程 2025-04-29
  • 數據結構與算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序算法、字符串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • 7ezmpyh全能編程工程師

    7ezmpyh是一個完全能勝任各種編程任務的全能編程工程師。本文將從多個方面對7ezmpyh進行詳細闡述,包括他的編程技能、項目經驗和個人特點。 一、編程技能 7ezmpyh擁有廣…

    編程 2025-04-29
  • 瘦臉算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉算法 Python 實現的原理和方法,包括該算法的意義、流程、代碼實現、優化等內容。 一、算法意義 隨着科技的發展,瘦臉算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • 全能編程開發工程師必備技能——如何優化大整數的計算

    本文將會為你分享如何解決大整數計算問題,以9999999967為例,我們將從多個方面對其做詳細闡述,並給出完整的代碼示例。 一、大整數的表示方法 在計算機中,我們通常採用二進制數來…

    編程 2025-04-29
  • xkujs全能編程開發工程師

    本文將從以下幾個方面詳細闡述xkujs作為一名全能編程開發工程師的技術能力和實戰經驗,為初學者提供學習參考。 一、JavaScript基礎 作為一名全能編程開發工程師,JavaSc…

    編程 2025-04-29

發表回復

登錄後才能評論