第一题:两数之和

2024-08-23 13:44
文章标签 第一 两数

本文主要是介绍第一题:两数之和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LeetCode 第一道题目 “两数之和”(Two Sum)的详细解题思路和三种语言的实现如下:

题目描述

给定一个整数数组 nums 和一个整数 target,请你在数组中找出和为 target 的两个数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

你可以按任意顺序返回答案。

解题思路

我们可以使用以下方法来解决这个问题:

  1. 暴力法:使用两个嵌套的循环遍历所有可能的两数组合,检查是否有两个数的和等于 target。时间复杂度是 O(n^2),空间复杂度是 O(1)。

  2. 哈希表法:利用哈希表存储每个元素及其下标。在遍历数组时,计算 target - nums[i],然后检查这个值是否已经在哈希表中。如果在哈希表中找到了,则找到了满足条件的两个数,可以立即返回它们的下标。时间复杂度是 O(n),空间复杂度是 O(n),因为哈希表的插入和查找操作的平均时间复杂度是 O(1)。

C 语言实现

#include <stdio.h>
#include <stdlib.h>#define HASH_SIZE 10000// 哈希表节点
typedef struct {int key;int value;
} HashNode;// 哈希表
typedef struct {HashNode* table[HASH_SIZE];
} HashMap;// 初始化哈希表
void initHashMap(HashMap* map) {for (int i = 0; i < HASH_SIZE; i++) {map->table[i] = NULL;}
}// 哈希函数
int hash(int key) {return abs(key) % HASH_SIZE;
}// 插入哈希表
void insert(HashMap* map, int key, int value) {int index = hash(key);HashNode* node = (HashNode*)malloc(sizeof(HashNode));node->key = key;node->value = value;map->table[index] = node;
}// 查找哈希表
int search(HashMap* map, int key) {int index = hash(key);return map->table[index] ? map->table[index]->value : -1;
}// 两数之和
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {HashMap map;initHashMap(&map);int* result = (int*)malloc(2 * sizeof(int));*returnSize = 2;for (int i = 0; i < numsSize; i++) {int complement = target - nums[i];int index = search(&map, complement);if (index != -1) {result[0] = index;result[1] = i;return result;}insert(&map, nums[i], i);}return NULL;
}int main() {int nums[] = {2, 7, 11, 15};int target = 9;int returnSize;int* result = twoSum(nums, 4, target, &returnSize);if (result) {printf("Indices: %d, %d\n", result[0], result[1]);free(result);}return 0;
}

Java 实现

import java.util.HashMap;
import java.util.Map;public class TwoSum {public static int[] twoSum(int[] nums, int target) {Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < nums.length; i++) {int complement = target - nums[i];if (map.containsKey(complement)) {return new int[] { map.get(complement), i };}map.put(nums[i], i);}throw new IllegalArgumentException("No two sum solution");}public static void main(String[] args) {int[] nums = {2, 7, 11, 15};int target = 9;int[] result = twoSum(nums, target);System.out.println("Indices: " + result[0] + ", " + result[1]);}
}

Python 实现

def two_sum(nums, target):num_to_index = {}for i, num in enumerate(nums):complement = target - numif complement in num_to_index:return [num_to_index[complement], i]num_to_index[num] = iraise ValueError("No two sum solution")# 示例使用
nums = [2, 7, 11, 15]
target = 9
result = two_sum(nums, target)
print(f"Indices: {result[0]}, {result[1]}")

时间复杂度

  • 暴力法

    • 时间复杂度:O(n^2)
    • 空间复杂度:O(1)
  • 哈希表法

    • 时间复杂度:O(n)
    • 空间复杂度:O(n)

总结

  • 暴力法:时间复杂度较高,但实现简单。适合数据量小的情况。
  • 哈希表法:时间复杂度较低,适合数据量大的情况,使用哈希表可以显著提高效率。

这篇关于第一题:两数之和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1099547

相关文章

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

半年高达552亿元,锁定云第一,中国电信天翼云紧追不舍

【科技明说 | 科技热点关注】 刚才我注意到中国电信公布2024年中期业绩,报告期内,中国电信实现营业收入为人民币2660亿元,同比增长2.8%,其中服务收入为人民币2462亿元,同比增长4.3%;净利润为人民币218亿元,同比增长8.2%。 其中亮点,2024年上半年,天翼云保持快速增长,收入达到了552亿元,同比增长20.4%,占服务收入比升至22.4%,市场头部地位进一步巩固。 为

Leetcode面试经典150题-2.两数相加

解法都在代码里,不懂就留言或者私信 理论上提交这个就是最优解 字节考过不下20次,这个高居字节面试榜第9名 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) {

双项第一!鼎捷强势领跑PLM市场

近日,国际数据公司IDC发布了《中国PLM市场分析及厂商份额,2023:创新左移》 报告数据显示鼎捷PLM2023年收入增长率39.5%,收入增速市场第一 鼎捷在多个细分行业市场中保持领先,在装备制造PLM领域市场份额达到7.9%市占率第一 IDC《中国PLM市场分析及厂商份额,2023:创新左移》(Doc#CHC52050724,2024年8月) 报告数据显示,2023年中国PLM软

2024全国大学省数学建模竞赛A题-原创参考论文(部分+第一问代码)

一问题重述 1.1 问题背景  "板凳龙",又称"盘龙",是浙闽地区的传统地方民俗文化活动。这种独特的表演艺术形式融合了中国传统龙舞的精髓和地方特色,展现了人们对美好生活的向往和对传统文化的传承。 在板凳龙表演中,人们将少则几十条,多则上百条的板凳首尾相连,形成蜿蜒曲折的"龙"形。这种创新的表演方式不仅展现了民间艺术的智慧,也体现了集体协作的精神。盘龙时,龙头在前领头,龙身和龙尾相随盘旋,整

Google 实现量子霸权!3分20秒运算,世界第一超算要跑1万年!

大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! By  大数据技术与架构 场景描述:谷歌宣称“量子霸权”已经实现,他们首次在实验中证明了量子计算机对于传统架构计算机的优越性:在世界第一超算 Summit 需

全网第一 | Flink学习面试灵魂40问答案,文末有福利!

大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! 来源:王知无 作者:王知无 By 暴走大数据 场景描述:这是一份Flink学习面试指北。看看你搞清楚自己的定位没有? 关键词:Flink 学

【LeetCode】01.两数之和

题目要求 做题链接:1.两数之和 解题思路 我们这道题是在nums数组中找到两个两个数使得他们的和为target,最简单的方法就是暴力枚举一遍即可,时间复杂度为O(N),空间复杂度为O(1)。 代码实现 class Solution {public:vector<int> twoSum(vector<int>& nums, int target) {//暴力枚举int n=nums

【硬刚ES】ES基础(十五)第一部分总结

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的ES部分补充。

力扣第一题:两数之和

文章目录 需求分析代码结尾 需求 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[