考研党从头学JAVA DAY1--下篇

这篇主要是关于算法的,用的提交网站是力扣。

题目:两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

思路:

1.普通解的思维方式非常简单,就是两个for循环,依次相加判断是否等于target值即可。

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};
                }
            }
        }
        return new int[]{};
    }
}

显而易见,这里的时间复杂度是O(n^2),但是进阶地方在这里提问是否可以找到时间复杂度小于O(n^2)的算法,所以我这里问了一下豆包。

2.

豆包给出的最优解:

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int[] twoSum(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)) {
                // 如果存在,则返回包含两个索引的数组
                return new int[]{map.get(complement), i};
            }
            // 将当前元素及其索引存入哈希表
            map.put(nums[i], i);
        }
        // 如果没有找到符合条件的两个数,返回一个空数组
        return new int[]{};
    }
}

这种方法只需要遍历一次表即可,思路就是计算差值,如果能找到对应的差值,就可以找到目标。通俗讲就是,如示例2,3与6作差得到3,存储complement的值为3,之后2与第一个存储的complement值,也就是3比较,不相等,然后2与6作差得到complement为4,继续走,发现4刚好与2对应的complement值,也就是4相等,因此找到了满足条件的两个值,直接返回他们俩的数组位置。

而且constainKey和get操作的时间复杂度都是O1,总体遍历一遍复杂度是On,因此在On的时间复杂度下就能完成。具体关于Map,HashMap的使用方法我会在明天或者后天总结。

你可能感兴趣的:(java,算法,leetcode)