1、两数之和

题目:两数之和题目

目录

方法一:暴力枚举

C

C++

go

java

python

方法二:哈希表

C

C++

go:

java

python


方法一:暴力枚举

C

/*
定义解决两数相加问题的函数,返回类型为整型,其中:
    nums:整型一维动态空间
    numsSize:整型,表示动态空间的长度
    target:整型
    returnSize:整型一维动态空间,表示返回的动态空间长度
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    // 两个for循环寻找动态空间中全部数字的相加情况
    for (int i = 0; i < numsSize; ++i) {            // 从0到(numsSize-1)循环
        for (int j = i + 1; j < numsSize; ++j) {    // 从(i+1)到(numsSize-1)循环
            if (nums[i] + nums[j] == target) {      // 判断索引i和j对应的动态空间中的数字相加是否等于target
                int* ret = malloc(sizeof(int) * 2); // 定义整型一维容器ret,并限制为 2*sizeof(int)=8 个字节的空间
                ret[0] = i, ret[1] = j;             // 将索引i、索引j赋值到容器ret
                *returnSize = 2;                    // 表示返回的动态空间大小为2
                return ret;                         // 返回容器ret
            }
        }
    }
    *returnSize = 0;    // 重置动态空间长度
    return NULL;        // 返回空,清除缓存
}

C++

class Solution {    // 定义类“Solution”
public:             // 公有继承
/*
定义整型函数“twoSum”,返回类型为整型,其中:
    nums:整型调用容器
    target:整型
*/
    vector<int> twoSum(vector<int>& nums, int target) {
        int n = nums.size();                        // 取nums容器的长度并赋值给n  
        // 两个for循环寻找容器中全部数字的相加情况
        for (int i = 0; i < n; ++i) {               // 从0到(n-1)循环
            for (int j = i + 1; j < n; ++j) {       // 从(i+1)到(n-1)循环
                if (nums[i] + nums[j] == target) {  // 判断索引i和j对应的容器nums中的数字相加是否等于target
                    return {i, j};                  // 满足条件,则返回索引i和j组成的数组
                }
            }
        }
        return {};                                  // 返回空数组,清除缓存
    }
};

go

/*
定义解决两数相加问题的函数"twoSum",返回类型为整型动态空间,其中:
    nums:整型一维动态空间
    target:整型
*/
func twoSum(nums []int, target int) []int {
	// 两个for循环寻找容器中全部数字的相加情况
    for i, x := range nums {					// i从0到(nums的长度-1)循环,其中x为i索引对应的值
        for j := i + 1; j < len(nums); j++ {	// 从(i+1)到(nums的长度)循环
            if x+nums[j] == target {			// 判断 x 与  j对应的容器nums中的数字  相加是否等于target
                return []int{i, j}				// 满足条件,则返回索引i和j组成的数组
            }
        }
    }
    return nil									// 返回空,清除缓存
}

java

// 定义类“Solution”
class Solution {
    /*
    定义函数“twoSum”,返回类型为整型数组,其中:
        nums:整型调用容器
        target:整型
    */
    public int[] twoSum(int[] nums, int target) {
        int n = nums.length;                        // 取nums容器的长度并赋值给n 
        // 两个for循环寻找容器中全部数字的相加情况
        for (int i = 0; i < n; ++i) {               // 从0到(n-1)循环
            for (int j = i + 1; j < n; ++j) {       // 从(i+1)到(n-1)循环
                if (nums[i] + nums[j] == target) {  // 判断索引i和j对应的容器nums中的数字相加是否等于target
                    return new int[]{i, j};         // 满足条件,则返回索引i和j组成的数组
                }
            }
        }
        return new int[0];                          // 返回空数组,清除缓存
    }
}

python

# 定义类“Solution”
class Solution:
    '''
    定义解决两数相加问题的函数,其中:
        self:表示实例本身,类中定义函数的第一参数
        nums:整型列表
        target:整型
        函数的返回类型:整型列表
    '''
    def twoSum(self,nums: List[int], target: int) -> List[int]:
        n = len(nums)                               # 取nums列表的长度并赋值给n   
        # 两个for循环寻找列表中全部数字的相加情况
        for i in range(n):                          # 从0到(n-1)循环
            for j in range(i + 1, n):               # 从(i+1)到(n-1)循环
                if nums[i] + nums[j] == target:     # 判断i和j索引对应的列表中的数字相加是否等于target
                    return [i, j]                   # 满足条件则返回索引i和j构成的列表
        
        return []                                   # 返回空列表,清除缓存



方法二:哈希表

C

struct hashTable {      // 声明结构体hashTable
    int key;            // 定义整型键
    int val;            // 定义整型值
    UT_hash_handle hh;  // 创建hashTable
};

struct hashTable* hashtable;

// 寻找符合条件的索引
struct hashTable* find(int ikey) {
    struct hashTable* tmp;
    HASH_FIND_INT(hashtable, &ikey, tmp);
    return tmp;
}

// 插入索引
void insert(int ikey, int ival) {
    struct hashTable* it = find(ikey);
    if (it == NULL) {
        struct hashTable* tmp = malloc(sizeof(struct hashTable));
        tmp->key = ikey, tmp->val = ival;
        HASH_ADD_INT(hashtable, key, tmp);
    } else {
        it->val = ival;
    }
}


/*
定义解决两数相加问题的函数,返回类型为整型,其中:
    nums:整型一维动态空间
    numsSize:整型,表示动态空间的长度
    target:整型
    returnSize:整型一维动态空间,表示返回的动态空间长度
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    hashtable = NULL;                                   // 初始化哈希表
    for (int i = 0; i < numsSize; i++) {                // 从0到(numsSize-1)循环
        struct hashTable* it = find(target - nums[i]);
        if (it != NULL) {                               // 若寻找结果不为空
            int* ret = malloc(sizeof(int) * 2);         // 定义整型一维容器ret,并限制为 2*sizeof(int)=8 个字节的空间
            ret[0] = it->val, ret[1] = i;
            *returnSize = 2;                            // 表示返回的动态空间大小为2
            return ret;                                 // 返回容器ret
        }
        insert(nums[i], i);                             // 将索引存入
    }
    *returnSize = 0;                                    // 重置动态空间长度
    return NULL;                                        // 返回空,清除缓存
}

C++

class Solution {    // 定义类“Solution”
public:             // 公有继承
    /*
    定义整型函数“twoSum”,返回类型为整型,其中:
        nums:整型调用容器
        target:整型
    */
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> hashtable;                  // 创建无序表hashtable,键和值都为整型
        for (int i = 0; i < nums.size(); ++i) {             // 从0到(nums长度-1)循环
            auto it = hashtable.find(target - nums[i]);     // 寻找 hashtable 中是否存在指定的 key 对应的映射关系:target = nums[i] + nums[i]
            if (it != hashtable.end()) {                    // 如果 hashtable 没有被遍历完
                return {it->second, i};                     // 则返回索引
            }
            hashtable[nums[i]] = i;                         // 输出符合条件的索引
        }
        return {};                                          // 返回空,清除缓存
    }
};

go:

/*
定义解决两数相加问题的函数"twoSum",返回类型为整型动态空间,其中:
    nums:整型一维动态空间
    target:整型
*/
func twoSum(nums []int, target int) []int {
    // Go 语言Map(集合):https://www.runoob.com/go/go-map.html
    hashTable := map[int]int{}                  // 建立无序的键值对的集合hashTable,键和值都为整型
    for i, x := range nums {                    // 枚举数列 nums ,i为索引,x为对应值
        if p, ok := hashTable[target-x]; ok {   // 判断 hashtable 中是否存在指定的 key 对应的映射关系:target = x + x
            return []int{p, i}                  // 返回符合条件的索引
        }
        hashTable[x] = i                        // 输出符合条件的索引
    }
    return nil                                  // 返回空,清除缓存
}

java

// 定义类“Solution”
class Solution {
    /*
    定义函数“twoSum”,返回类型为整型数组,其中:
        nums:整型调用容器
        target:整型
    */
    public int[] twoSum(int[] nums, int target) {
        // java的HashMap:https://www.runoob.com/java/java-hashmap.html
        Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();  // 创建 HashMap 对象 hashtable,键和值都为整型
        for (int i = 0; i < nums.length; ++i) {                             // 从0到(nums长度-1)循环
            // Java HashMap containsKey() 方法:https://www.runoob.com/java/java-hashmap-containskey.html
            if (hashtable.containsKey(target - nums[i])) {                  // 检查 hashtable 中是否存在指定的 key 对应的映射关系:target = nums[i] + nums[i]
                return new int[]{hashtable.get(target - nums[i]), i};       // 将存在的键值对中的i放入hashtable容器
            }
            hashtable.put(nums[i], i);                                      // 输出hashtable容器
        }
        return new int[0];                                                  // 返回空数组,清除缓存
    }
}

python

# 定义类“Solution”
class Solution:
    '''
    定义解决两数相加问题的函数,其中:
        self:表示实例本身,类中定义函数的第一参数
        nums:整型列表
        target:整型
        函数的返回类型:整型列表
    '''
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashtable = dict()                              # 创建字典hashtable,即键值对
        # Python3 enumerate() 函数:https://www.runoob.com/python3/python3-func-enumerate.html
        for i, num in enumerate(nums):                  # 枚举数列 nums ,i为索引,num为对应值
            if target - num in hashtable:               # 判断 hashtable 中是否存在指定的 key 对应的映射关系:target = num + num
                return [hashtable[target - num], i]     # 返回存在的键值对应的i值
            hashtable[nums[i]] = i                      # 输出符合条件的索引
        return []                                       # 返回空列表,清除缓存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值