题目
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
C语言
双重循环求解
/** * Note: The returned array must be malloced, assume caller calls free(). */
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
int i,j; int *result_num;
result_num = (int *)malloc(sizeof(int)*2);
for (i = 0; i < numsSize; i++)
{
for (j = i + 1; j < numsSize; j++)
{
if (target == nums[i] + nums[j])
{
*returnSize = 2;
result_num[0] = i;
result_num[1] = j;
return result_num;
}
}
}
return NULL;
}
哈希表求解
空间换时间
#include<stdio.h>
struct sum{
int exi;//是否存在
int local;//存在的位置
};
int a[8]={5,9,11,4,2,7,3,6};//随意定义无序无重复
int flag=9;//两数相加目标值
int len=8;//数组长度
void main(){
struct sum sum1[20];//长度为最大数的值+1
int i;
for(i=0;i<20;i++){//初始化
sum1[i].exi=0;
sum1[i].local=0;
}
int i1;
for(i1=0;i1<len;i1++){//给数组中存在的数赋值
sum1[a[i1]].exi=1;
sum1[a[i1]].local=i1;
}
int i2;
for(i2=0;i2<len;i2++)
{
int num=flag-a[i2];
if(sum1[num].exi==1){//哈希表查找
printf("%d,%d\n",i2,sum1[num].local);
sum1[num].exi=0;//查找结束将这两个加数删除
sum1[a[i2]].exi=0;
}
}
}
c++
重点就是c++hashmap的应用
class Solution {
public int[] twoSum(int[] nums, int target) {
if(nums == null || nums.length < 2){
return new int[]{-1, -1};
}
int[] res = new int[]{-1,-1};
HashMap<Integer,Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
if(map.containsKey(target - nums[i])){
res[0] = map.get(target - nums[i]);
res[1] = i;
}
map.put(nums[i],i);
}
return res;
}
}