算法复习一(两数之和)

算法每天一练:
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用
示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
 

package com.qts.misc;

import com.google.common.collect.Maps;
import java.util.HashMap;
import java.util.Map;

public class MiscApplicationTests {


    /**
     * 暴力遍历解决
     * @param nums
     * @param target
     */
    public static void twoSum(int[] nums,int target) {

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

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

                int result = nums[i] + nums[j];
                if(result == target){
                    System.out.print("["+i+","+j+"]");
                }
            }
        }
    }

    /**
     * 两次哈希解决
     * @param nums
     * @param target
     * @return
     */
    public static int[] twoSumHash(int[] nums,int target) {
        Map map = Maps.newHashMap();
        for(int i = 0 ; i < nums.length ; i ++){
            map.put(nums[i],i);
        }

        for(int j = 0 ; j < nums.length ; j ++){
            int res = target - nums[j];
            if(map.containsKey(res)){
                System.out.print("["+map.get(res)+","+j+"]");
                return new int[] { j, (int) map.get(res)};
            }
        }

        return null;
    }

    /**
     * 一次哈希
     * @param nums
     * @param target
     * @return
     */
    public static int[] twoSumOneHash(int[] nums,int target) {
        Map map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];
            if (map.containsKey(complement)) {
                System.out.print("["+map.get(complement)+","+i+"]");
                return new int[] { map.get(complement), i };
            }
            map.put(nums[i], i);
        }
        return null;
    }

    public static void main(String[] args) {

        int[] param = {1,3,2,4};
        twoSumOneHash(param,5);
    }
}

复杂度分析一:

  • 时间复杂度:O(n^2)O(n2), 对于每个元素,我们试图通过遍历数组的其余部分来寻找它所对应的目标元素,这将耗费 O(n)O(n) 的时间。因此时间复杂度为 O(n^2)O(n2)。

  • 空间复杂度:O(1)O(1)。

复杂度分析二:

  • 时间复杂度:O(n)O(n), 我们把包含有 nn 个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1)O(1) ,所以时间复杂度为 O(n)O(n)。

  • 空间复杂度:O(n)O(n), 所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 nn 个元素。 

复杂度分析三:

  • 时间复杂度:O(n)O(n), 我们只遍历了包含有 nn 个元素的列表一次。在表中进行的每次查找只花费 O(1)O(1) 的时间。

  • 空间复杂度:O(n)O(n), 所需的额外空间取决于哈希表中存储的元素数量,该表最多需要存储 nn 个元素。

你可能感兴趣的:(java,基础,算法分析)