美文网首页一日一道算法题
每日一道算法题[1-100]--两数之和

每日一道算法题[1-100]--两数之和

作者: 云原生研习社 | 来源:发表于2019-06-23 22:11 被阅读0次

2019年6月23日,立一个flag每天做一道算法题,先坚持100天!中间不定期更新做题的一些感受和做题的方式方法

今天先来第一道题,来自于LeetCode上面的一道题目,同时也是很多公司笔试题中的一道。

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum

示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum

解题思路:

思路一: 首先已知是一个整型数组,需要两两求和,所以可以通过两个for循环来处理,在这里需要注意第二个for循序只需要从第一个for循环的下标+1处开始循环即可!

该方法的时间去复杂度为O(n^2),空间复杂度为O(1)


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

        int[] is = new int[2];

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

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

                int r = nums[i] + nums[j] ;

                if(r == target){

                    is[0] = i ;

                    is[1] = j ;

                }

            }

        }

        return is;

    }

思路二:可以通过哨兵,在for循环外面进行计算,用target-num[i] 如果内循环里面有一个等于这个值,则取出下标


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

        int[] rs = new int[2];

        int flag = 0;

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

            flag = target - nums[i];

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

                if(nums[j] == flag){

                    rs[0] = i;

                    rs[1] = j;

                }

            }

        }

        return rs;

    }

思路三:通过hash表存储数组数据,通过空间换取时间方式

时间复杂度为O(n) , 前面循环map存入数据占用的复杂度为n,后面的查询复杂度为1

空间复杂度为O(n)


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

        HashMap<Integer,Integer> hashMap = new HashMap<>();

        int[] res = new int[2];

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

            hashMap.put(nums[i],i);

        }

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

            int flag = target - nums[j];

            if(hashMap.containsKey(flag) && hashMap.get(flag) != j){

                res[0] = j;

                res[1] = hashMap.get(flag);

                return res;

            }

        }

        return res;

    }

思路四:通过一个循环法即可得到结果值

时间复杂度为O(n) , 空间复杂度为O(n)


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

      HashMap<Integer, Integer> hashMap = new HashMap<>();

        int[] res = new int[2];

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

            int flag = target - nums[i];

            if (hashMap.containsKey(flag)) {

              res[0] = hashMap.get(flag);

              res[1] = i;

              return res;

            }

            hashMap.put(nums[i], i);

        }

        return res;

    }

第四种方式说明一下:

比如数组为:{1,3,6,7,9} ,target = 13

则:第一次循环flag = 13-1 = 12 map中不包含则put进去 map.put(1,0)

第二次循环flag=13-3 = 10 map中不包含则put进去 map.put(3,1)

第三次循环flag=13-6=7 map中不包含7 则put进去 map.put(6,2)

第四次循环flag=13-7=6 此时map中已经包含了7,下标为2 则返回下标2和下标3(7的下标)

相关文章

  • 每日一道算法题[1-100]--两数之和

    2019年6月23日,立一个flag每天做一道算法题,先坚持100天!中间不定期更新做题的一些感受和做题的方式方法...

  • 每日算法(两数之和、两数相加)-11.12

    今天开始记录每天学习一道两道的算法题,由简入难。今天一共学习了两道算法,一道简单一道中等,分别为两数之和、两数相加...

  • ATRS第1周

    ATRS Algorithm算法题: 两数之和 - 力扣 (LeetCode) ``` function twoS...

  • 算法题-两数之和

    题目描述: 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们...

  • LeetCode-两数之和

    来年就要找工作了,刷刷lc复习数据结构和算法。两数之和是第一道题,可能也是最简单的一道题,我准备从这里开始记录我的...

  • 每日两道算法题 - 两数之和

    问题 给定一个数组和一个目标值,获取相加之合为目标值的数组中两个元素的下标并输出。输入:nums = [2,7,1...

  • 两数之和&三数之和&四数之和&K数之和

    今天看了一道谷歌K数之和的算法题,忽然想起来之前在力扣上做过2、3、4数之和的题,觉得很有必要来整理一下。其实2、...

  • LeetCode算法题,两数之和

    题目出处:https://leetcode-cn.com/problems/two-sum/ 题目描述:给定一个整...

  • 算法题之---《两数之和》

    题目: 给定一个数组和一个目标值target,不考虑重复使用元素,找出数组中和=target的两个元素。 首先,最...

  • 算法刷题-两数之和

    八个Docker的真实应用场景 【编者的话】Flux 7介绍了常用的8个Docker的真实使用场景,分别是简化配置...

网友评论

    本文标题:每日一道算法题[1-100]--两数之和

    本文链接:https://www.haomeiwen.com/subject/pnzwqctx.html