栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

1LeetCode.两数之和

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

1LeetCode.两数之和

解法1:暴力法:

最容易想到的方法是枚举数组中的每一个数 x,寻找数组中是否存在 target - x。

当我们使用遍历整个数组的方式寻找 target - x 时,需要注意到每一个位于 x 之前的元素都已经和 x 匹配过,因此不需要再进行匹配。而每一个元素不能被使用两次,所以我们只需要在 x 后面的元素中寻找 target - x。

class Solution {

    public int[] twoSum(int[] nums, int target) {

        for(int i = 0;i < nums.length;i++) {

            for(int j =i + 1;j < nums.length;j++) {

                if(nums[i] + nums[j] == target){

                    return new int[]{i,j};//创建有i和j的数组

                }

            }

        }

        return new int[]{};//返回创建的新的空数组

    }

}

注意:数组的长度是属性

解法2:查找表法:在遍历的同时记录一些信息,以省去一些循环,这是以“空间换时间的想法”需要记录已经遍历过的数值和他所对应的下标,可以借助查找表实现

注:查找表有两个常用的实现,分别是:哈希表和平衡二叉搜索树,由于我们不需要维护查找表中的元素的顺序,因此哈希表就是我们的首选。

思路:先创建一个哈希表,key和value都是int类型。然后开始遍历数组nums,i为nums数组的当前下标,每遍历数组中的一个nums[i],就判断哈希表中是否包含target-nums[i]的key值,如果不包含这个值,则将当前遍历到的以这种形式(nums[i],i)存到哈希表中,继续遍历直到找到为止;

如果哈希表中存在target-nums[i]的key值,则就找到了两个相加为target的值,就可以通过哈希表中的key(这里哈希表的key=target-nums[i])来得到value(这里哈希表的value=元素下标);

如果最终都没有结果就返回空数组。

代码:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map map = new HashMap<>();
        for(int i = 0; i< nums.length; i++) {
            if(map.containsKey(target - nums[i])) {//判断哈希表中是否包含target - nums[i]值
                return new int[] {map.get(target-nums[i]),i};//如果包含就返回map通过key获取value(也就是target - nums[i]元素在哈希表中的下标)和遍历到的nums[i]的i下标
            }
            map.put(nums[i], i);//如果哈希表中不存在,就将当前遍历的元素加入表中
        }
       return new int[0];//最终找不到两个元素的和为target,就返回空数组
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/925713.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号