题解 | #两数之和#
两数之和
https://www.nowcoder.com/practice/20ef0972485e41019e39543e8e895b7f
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型一维数组
* @param numbersLen int numbers数组长度
* @param target int整型
* @return int整型一维数组
* @return int* returnSize 返回数组行数
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
// write code here
int* re=(int*)malloc(sizeof(int)*2);
*returnSize=2;
int flag=0;
for(int i=0;i<numbersLen-1;i++)
{
for(int j=i+1;j<numbersLen;j++)
{
if(numbers[j]==(target-numbers[i]))
{
re[0]=i+1;
re[1]=j+1;
flag++;
break;
}
}
if(flag)
{
break;
}
}
return re;
}
*/
//numbers[i] > target+10;
//因为题目给的数组中可能包含最小为-10的负数,需要当前数大于目标值+10,再跳过以免忽略含[100,-10]90的情况
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
// write code here
int* re=(int*)malloc(sizeof(int)*2);
*returnSize=2;
int flag=0;
for(int i=0;i<numbersLen-1;i++)
{
if(numbers[i]>target+10) continue;
//w为什么要加上面的这行?
//因为数组中最小的数也就是-10,若数大于目标超过10,则不可能找到另一个数相加=target
for(int j=i+1;j<numbersLen;j++)
{
if(numbers[j]==(target-numbers[i]))
{
re[0]=i+1;
re[1]=j+1;
flag++;
break;
}
}
if(flag)
{
return re;
// break;
}
}
return 0;
}
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型一维数组
* @param numbersLen int numbers数组长度
* @param target int整型
* @return int整型一维数组
* @return int* returnSize 返回数组行数
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
//下面这个为暴力遍历,时间复杂度太高
//因为没有忽略不可能为加数的数组值
/*int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
// write code here
int* re=(int*)malloc(sizeof(int)*2);
*returnSize=2;
int flag=0;
for(int i=0;i<numbersLen-1;i++)
{
for(int j=i+1;j<numbersLen;j++)
{
if(numbers[j]==(target-numbers[i]))
{
re[0]=i+1;
re[1]=j+1;
flag++;
break;
}
}
if(flag)
{
break;
}
}
return re;
}
*/
//numbers[i] > target+10;
//因为题目给的数组中可能包含最小为-10的负数,需要当前数大于目标值+10,再跳过以免忽略含[100,-10]90的情况
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
// write code here
int* re=(int*)malloc(sizeof(int)*2);
*returnSize=2;
int flag=0;
for(int i=0;i<numbersLen-1;i++)
{
if(numbers[i]>target+10) continue;
//w为什么要加上面的这行?
//因为数组中最小的数也就是-10,若数大于目标超过10,则不可能找到另一个数相加=target
for(int j=i+1;j<numbersLen;j++)
{
if(numbers[j]==(target-numbers[i]))
{
re[0]=i+1;
re[1]=j+1;
flag++;
break;
}
}
if(flag)
{
return re;
// break;
}
}
return 0;
}