首页 > 其他分享 >LeetCode | 1 Two Sum

LeetCode | 1 Two Sum

时间:2024-08-09 15:27:07浏览次数:5  
标签:return target nums int Sum Two 索引 new LeetCode

分析

Given an array of integers nums and an integer target, return indices of the two numbers such that they add up to target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
You can return the answer in any order.

寻找两个不同元素相加等于目标值并返回其索引

梦开始的地方也是梦夭折的地方!

这个题目,刻意摘录下原题英文描述,因为我觉得英文描述的更加准确。indices of the two numbers即返回的是目标数据的索引下标,not use the same element twice表明,一个索引只能被用一次,即便是比如目标值为10,而索引1对应的元素值为5,也不能自己跟自己相加,得出错误结果[1,1]

依据题目的意思,原始的数组,索引跟数据是一对一绑定,倘若我们自行在这个数组之上进行去重或者排序都会破坏这个数组的原有结构,与我们的最终结果背道而驰。在这种情况下,我就需要先将数据元素值和索引下标进行包装,形成一个独立的数据。因为数据本身无法独立存在,需要能够装它的容器,很容易想到键值对的结构Map

接着问题就来了,键值对的键在此刻是选择原始的索引下标呢,还是数据元素值呢?倘若我使用的是索引下标,那么这样的Map结构就退化到了数组结构,也就是自己的这种包装毫无意义。用数据元素值作为索引,类似于一种依赖倒置,嗯,我需要的也是通过元素寻找索引。

可还没有解决问题,又该如何去寻找这两个数呢?嗯,不妨换个思路,target = wrappedA + wrappedB 转换为 wrappedB = target - wrappedA,有什么区别吗?在已知target和遍历过程中的获得的确定值wrappedA,去寻找未知的wrappedB,把原本两个自由量降低为1个自由量,寻找唯一元素,边存数据,边找数据,Hash结构的主场了。

LeetCode242 Valid-Anagram这道题的解法,那时候我在思考,Hash结构这个容器,一个数组把数据存放进去,另一个数组相当于取出与条件相匹配的数据,在Valid-Anagram中是寻找字母个数相同的所有数据,在这道题取出与放入的数据之和为目标值的数据。

总结

  • 原始数据结构需要保护,使用键值对生成对应的包装数据
  • 利用哈希表来配对:对于每个元素nums[i],计算target-nums[i]

主类

package com.github.dolphinmind.hash;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author dolphinmind
 * @ClassName TwoSum
 * @description
 * @date 2024/8/9
 */

public class TwoSum {

    /**
     * 获取单个结果即返回
     * @param nums
     * @param target
     * @return
     */
    public int[] twoSumGetOneResult(int[] nums, int target) {
        if (nums == null || nums.length < 2 ) {
            return null;
        }

        Map<Integer, Integer> map = new HashMap<>();

        for (int i = 0; i < nums.length; i++) {
            int difference = target - nums[i];
            if (map.containsKey(difference)) {
                return new int[]{map.get(difference),i};
            }

            map.put(nums[i],i);
        }
        return new int[0];
    }

    /**
     * 获取所有结果
     */

    public List<List<Integer>> twoSumGetAllResult(int[] nums, int target) {
        if (nums == null | nums.length < 2) {
            return null;
        }

        //值:索引列表
        Map<Integer, List<Integer>> map = new HashMap();
        // 索引对结果集合
        List<List<Integer>> res = new ArrayList<>();

        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];

            if (map.containsKey(complement)) {
                for (int index : map.get(complement)) {
                    List<Integer> pair = new ArrayList<>();
                    pair.add(index);
                    pair.add(i);
                    res.add(pair);
                }
            }

            map.computeIfAbsent(nums[i], k -> new ArrayList<>()).add(i);
        }

        return res;

    }
}

测试类

package com.github.dolphinmind.hashcode;

import com.github.dolphinmind.hash.TwoSum;
import org.junit.Test;

import java.util.List;

/**
 * @author dolphinmind
 * @ClassName TwoSumTest
 * @description
 * @date 2024/8/9
 */

public class TwoSumTest {

    @Test
    public void test_towSumGetOneResult() {
        int[] nums = {1,3,5,7,8,9};
        int target = 10;

        TwoSum twoSum = new TwoSum();
        int[] res = twoSum.twoSumGetOneResult(nums, target);
        System.out.println("获取单个索引对结果:"+res[0] + " " + res[1]);

        List<Integer> integers = twoSum.twoSumGetAllResult(nums, target).get(0);
        System.out.println("获取所有索引对结果:"+integers.get(0) + " " + integers.get(1));
    }

    @Test
    public void test_towSumGetAllResult() {
        int[] nums = {1,1,1,3,5,7,8,9,7,8,9};
        int target = 10;

        TwoSum twoSum = new TwoSum();
        List<List<Integer>> lists = twoSum.twoSumGetAllResult(nums, target);
        for (List<Integer> list : lists) {
            System.out.println(list.get(0) + " " + list.get(1));
        }

        System.out.println(lists.get(0));
    }
}

标签:return,target,nums,int,Sum,Two,索引,new,LeetCode
From: https://www.cnblogs.com/dolphinmind/p/18350823

相关文章

  • Leetcode | 202 Happy Number
    分析在快乐数的题意上,通常情况下我们都会去顺着题目的意思去寻找最终结果是否为1,而后面的另一句话很有启示意义:"也可能是无限循环,但始终变不到1",那么为什么不会是无限不循环呢?证明范围限制:对于一个(d)位数的正整数(n),其最大值为99d=Max位数减少:每次计算之后,数字位数d要么减......
  • Leetcode热题100-128.最长连续序列
    Leetcode热题100-128.最长连续序列1.题目描述2.解题思路3.代码实现1.题目描述128.最长连续序列2.解题思路使用哈希集合的思想:初始化一个unordered_set并将nums中所有元素放入集合中;遍历数组,依次判断当前元素是否为连续序列的开始,若是则求出当前连续序列......
  • leetcode考试题
       +-------------+----------+|ColumnName|Type|+-------------+----------+|id|int||client_id|int||driver_id|int||city_id|int||status|enum||request_at|varchar|......
  • LeetCode | 349 Intersection Of Two Arrays
    分析两个数组的交集,双指针使用的前提是,两个数组已经处于有序状态。双指针的本质是遍历;双指针在线性数据结构中,进行数据处理,每次只专注于两个元素;指针遍历将问题拆解为两部分,即已解决和待解决问题。倘若两个数组是无序的状态,双指针指向每次都无法确认是否在历史中已经出现过,这个时......
  • LeetCode 1111. 有效括号的嵌套深度
    1111.有效括号的嵌套深度有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。详情参见题末「有效括号字符串」部分。嵌套深度 depth 定义:即有效括号字符串嵌套的层数,depth(A) 表示有效括号字符串 A 的嵌套深度。详情参见题末「嵌套深度」部分。有......
  • torch.einsum 的计算过程
    概论a=torch.randn(3,2,2)b=torch.randn(3)c=torch.einsum('...chw,c->...hw',a,b)上面的einsum如何计算的?简单说,把b广播为a的形状,然后做矩阵乘法,即逐位相乘运算,注意,不是点积,是逐位的相乘运算。注:这里符合背景需求,背景是,a是深度学习的某个张量,b是a的权重,......
  • einsum 函数
    einsum是Einsteinsummation的缩写,即爱因斯坦求和约定。einsum函数源自NumPy,后来在PyTorch等其他科学计算库中也得到了实现。它是一种强大而灵活的函数,可以用来处理各种张量运算,如矩阵乘法、转置、批量点积、内积、外积等。爱因斯坦求和约定(EinsteinSummationConvent......
  • 代码随想录算法刷题训练营day49:LeetCode(42)接雨水、LeetCode(84)柱状图中最大的矩形
    代码随想录算法刷题训练营day49:LeetCode(42)接雨水、LeetCode(84)柱状图中最大的矩形LeetCode(42)接雨水题目代码importjava.util.Stack;classSolution{publicinttrap(int[]height){//用单调栈进行操作intsum=0;Stack<Integ......
  • LeetCode144 二叉树的前序遍历
    前言题目:144.二叉树的前序遍历文档:代码随想录——二叉树的递归遍历编程语言:C++解题状态:基础知识不了解思路两种思路,第一是递归。递归算法有三个要素。每次写递归,都按照这三要素来写!确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就......
  • (leetcode学习)50. Pow(x, n)
    实现 pow(x,n) ,即计算x的整数 n次幂函数(即,xn)。示例1:输入:x=2.00000,n=10输出:1024.00000示例2:输入:x=2.10000,n=3输出:9.26100示例3:输入:x=2.00000,n=-2输出:0.25000解释:2-2=1/22=1/4=0.25提示:-100.0<x<100.0-231<=n<=231......