全能工程师之:深入探究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/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

发表回复

登录后才能评论