一、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
微信掃一掃
支付寶掃一掃