题目:
给定一个整数数组 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};
有一个细节是输出的时候,是先把找到差值的内个元素下标输出了,然后才输出的此时遍历到的原本数组里的元素下标。所以从输出结果来看,是小的下标在前,大的在后。
实际这个代码是先给空字典里储存键值对,遍历到后面的值,在去前面的里面找有没有符合要求的。
刚开始学,不大懂,大白话比较多,大神轻喷,能帮助到同样初学的小伙伴最好不过。