欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

1. Two Sum

程序员文章站 2024-02-17 12:34:12
...

原题链接: https://leetcode.com/problems/two-sum/

1. 题目描述

Leetcode 第一题

输入:一组整数数组,和一个target值。
输出:两个整数加起来如果等于target,输出这两个整数的下标

每个输入都会有一个解,同一次输入不会有相同的整数。

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

2. 做题思路

1. 暴力搜索

使用i、j两个下标,对数组进行遍历,当找到 nums[i] + nums[j] == target 的i、j时,返回。时间复杂度O(n^2)

class Solution {
    public int[] twoSum(int[] nums, int target) {
		
        int[] res = new int[2];
        
		for(int i = 0;i<nums.length;i++) {
			for(int j = i+1;j<nums.length ;j++){
				if(nums[i]+nums[j] == target){
                    
                    res[0] = i;
                    res[1] = j;
					return res;
				}
			}
		}
		return res;
	}
}

2. 借助HashMap,两次循环

什么是HashMap?

HashMap由数组和链表组成,基于哈希表的Map接口实现,是以key-value存储形式存在。
系统会根据hash算法来计算key-value的存储位置,可以通过key快速存取value
允许对象值为null,并且没有个数限制

HashMap怎么用?

public void hashex(){
		//创建HashMap
		HashMap<Integer, String> hexample = new HashMap<>();
		
		//输入值,使用put方法
		hexample.put(1, "aa");//1是key,aa是value
		hexample.put(2, "bb");
		hexample.put(3, "cc");
		hexample.put(4, "dd");
		hexample.put(5, "ee");
		
		//输出值,使用get方法
		System.out.println(hexample.get(1));//输出结果为aa
		
		//判断是否存在某个key或者value
		System.out.println(hexample.containsKey(1));//输出结果为true
		System.out.println(hexample.containsKey(6));//输出结果为false
		System.out.println(hexample.containsValue("aa"));//输出结果为true
		System.out.println(hexample.containsValue("va"));//输出结果为false
	}

第一遍循环,先把数组nums存到HashMap里面去。
第二遍循环,遍历数组,寻找匹配的值。
时间复杂度O(n)。

class Solution {
    public int[] twoSum(int[] nums, int target) {
		
        int[] res = new int[2];
  
		HashMap<Integer, Integer> nummap = new HashMap<>();
		for(int i = 0;i<nums.length;i++){
			nummap.put(nums[i], i);
		}
		for(int i = 0;i<=nums.length;i++)
		{
			int temp = target - nums[i];
			if(nummap.containsKey(temp) && nummap.get(temp) != i ) {
				res[0] = i;
				res[1] = nummap.get(temp);
				return res;
			}
		}
		return res;
	}
}

3. 只用一次循环的HashMap

和上面的方法类似,但是,不需要把数组放入HashMap的第一遍循环了,直接遍历数组,如果在HashMap里面没有对应的temp的话,就放入一个值,否则就返回。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        HashMap<Integer,Integer> nummap2 = new HashMap<>();
		int lengthnum = nums.length;
		int temp = 0;
		for(int i = 0;i<lengthnum ; i++) {
			temp = target - nums[i];
			if(nummap2.containsKey(temp)) {
				return new int[] {nummap2.get(temp),i} ;//注意这里的先后顺序,一定是nummap2.get(temp)在前,i在后
			}
			else {
				nummap2.put(nums[i], i);
			}
		}
		return new int[] {0,0};
    }
}
相关标签: LeetCode HashMap