C#详解两数之和

本文详细介绍了两种使用C#找到数组中和为目标值的两个整数的方法:一是通过遍历的方式,二是利用字典进行查找。文中分别阐述了两种思路并提供了实现细节,特别强调了在遍历过程中确保返回值的处理和字典在算法中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:


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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

一、通过遍历的方式

public 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[2]{i,j};
                }
            }
        }
        return new int[0];
    }
}

思路:

1.明确函数的参数需要一个数组和一个和的值,返回值需要用数组的形式接收下标;

2.先遍历每个数组元素,每遍历一个元素,判断在剩下的元素中是否有跟该元素相加和为传入的参数的值(因为数字不能重复,且之前的元素已经判断过,所以判断第二个元素的时候从i+1开始遍历即可),如果是,将两个元素的下标储存到数组里返回。

3.注意:带有返回值的函数要保证全部路径都有返回值,所以在for循环结束后,要给所有不符合条件的情况一个返回值,可以返回一个int类型的空数组;

二、通过字典的方式

public class Solution {
    public int[] TwoSum(int[] nums, int target) {
        Dictionary<int,int> map=new Dictionary<int,int>();
        for(int i=0;i<nums.Length;i++)
        {
            int temp=target-nums[i];
            if(map.ContainsKey(temp))
            {
                Console.WriteLine(map[temp]);
                return new int[2]{map[temp],i};
            }else if(!map.ContainsKey(nums[i]))
            {
                map.Add(nums[i],i);
            }
        }
        return new int[0];
    }
}

思路:

1.对于每一个数组元素,用给定的和去减它,通过字典(把数组中的元素作为Key值,下标作为Value值)的方式查找是否存在该差值,如果存在,则把该key对应的value值取出来存入数组中返回;

反向解析:

public int[] TwoSum(int[] nums, int target) {
        Dictionary<int,int> map=new Dictionary<int,int>();
		Console.WriteLine(map.Count);
        ...
}

在创建好字典后写一条语句,让其输入此时字典包含的键值对个数,此时,输出结果是0。那字典中的键值对是何时添加进去的呢?

说明:

测试中用的数组是{2,6,7,10,2};target是16; 

在给字典中添加元素的部门写了一条语句:Console.WriteLine("循环中-"+map.Count);

用来输出添加部分总共被执行了几次。

if(map.ContainsKey(temp))  //temp=target-nums[i] 
{
    return new int[2]{map[temp],i};
}else if(!map.ContainsKey(nums[i]))
{
    map.Add(nums[i],i);    //把数组中的元素作为Key,下标作为Value添加到字典中
    Console.WriteLine("循环中-"+map.Count);
}

先来理解下这部分代码:

1.首先if的第一个判断条件是看字典中是否包含想要的值,上面已经说过,字典在此时仅创立并没有赋值,所以不符合该条件,再来看第一个if判断,判断字典中是否包含Key值是该数组元素,如果不包含,则把这个元素添加到字典里,此时,字典中就有了第一组键值对。

2.循环这个过程,字典中的键值对会逐渐增多,直到有一个数组元素进来,发现差值已经可以在之前存过的字典键值对中找到了,直接return,返回此时的i值和在字典中找到的内个Key值对应的Value。

return new int[2]{map[temp],i};

 有一个细节是输出的时候,是先把找到差值的内个元素下标输出了,然后才输出的此时遍历到的原本数组里的元素下标。所以从输出结果来看,是小的下标在前,大的在后。

实际这个代码是先给空字典里储存键值对,遍历到后面的值,在去前面的里面找有没有符合要求的。


刚开始学,不大懂,大白话比较多,大神轻喷,能帮助到同样初学的小伙伴最好不过。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值