给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。
(注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到)
数据范围:
,
,
要求:空间复杂度
,时间复杂度
[3,2,4],6
[2,3]
因为 2+4=6 ,而 2的下标为2 , 4的下标为3 ,又因为 下标2 < 下标3 ,所以返回[2,3]
[20,70,110,150],90
[1,2]
20+70=90
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize )
{
// write code here
if(!numbers||numbersLen<2)
{
return NULL;
}
int *arr=(int*)malloc(2*sizeof(int));
if(!arr)
{
return NULL;
}
for(int i=0;i<numbersLen;i++)
{
if(numbers[i]>target)
{
continue;
}
for(int j=i+1;j<numbersLen;j++)
{
int sum=numbers[i]+numbers[j];
if(sum==target)
{
arr[0]=i+1;
arr[1]=j+1;
*returnSize=2;
return arr;
}
}
}
free(arr); // 释放内存
return NULL; // 没有找到符合条件的数对,返回NULL
} int* twoSum(int* numbers, int numbersLen, int target, int* returnSize)
{
for (int i = 0; i < numbersLen; ++i)
{
for (int j = i + 1; j <numbersLen; ++j)
{
if (numbers[i] + numbers[j] == target)
{
int* ret = malloc(sizeof(int) * 2);
ret[0] = i+1, ret[1] = j+1;
*returnSize = 2;
return ret;
}
}
}
*returnSize = 0;
return NULL;
} /**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型一维数组
* @param numbersLen int numbers数组长度
* @param target int整型
* @return int整型一维数组
* @return int* returnSize 返回数组行数
*/
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
// write code here
int i,j;
int *a=(int*)malloc(sizeof(int)*2);//为数组提供空间
for(i=0;i<numbersLen;i++){
if(numbers[i]>target+10)//样例中数据>=-10,所以如果数据大于target+10则该数据不可能为目标数据,可以跳过循环
{
continue;
}
for(j=i+1;j<numbersLen;j++){
if(numbers[i]+numbers[j]==target){//循环遍历i之后的数据
a[0]=i+1;//将满足条件的数据下标存入数组
a[1]=j+1;
}
}
}
*returnSize=2;
return a;//返回数组
} static int a[2];
#include <stdlib.h>
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
// write code here
int i, j;
// int num1, num2;
// int *s = (int *)malloc(sizeof(int)*2); //用于返回
//遍历
for (i = 0; i < numbersLen; i++){
if (numbers[i] > target+10) {
continue;
}
for (j = i + 1; j < numbersLen; j++){
if (numbers[i] + numbers[j] == target) {
a[0] = i+1;
a[1] = j+1;
}
}
}
*returnSize = 2;
return a;
} /**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型一维数组
* @param numbersLen int numbers数组长度
* @param target int整型
* @return int整型一维数组
* @return int* returnSize 返回数组行数
*/
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
//使用拉链法解决冲突
typedef struct HashMapNode{
int data;
struct HashMapNode* next;
}HashMapNode,*HashMapHead;
//这个函数用于给散列表添加元素
void addHashMapNode(HashMapHead* head,int index){
HashMapHead a = (HashMapHead)malloc(sizeof(HashMapNode));
a->data=index;
a->next=NULL;
if(*head==NULL){
*head=a;
}
else{
HashMapHead temp = *head;
HashMapHead b;
while(temp!=NULL){
b=temp;
temp=temp->next;
}
a->next=b->next;
b->next=a;
}
}
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
// write code here
int* result = (int*)malloc(2*sizeof(int));
*returnSize+=2;
//创建一个散列表,大小:50000(主要是想尽量减少冲突的同时,又少用些内存)
int hashMapLen = 50000;
HashMapHead hash[hashMapLen];
//初始化散列表(这一步是挺浪费时间的,但是我真不知道怎么在c语言里初始化一个指针数组为null)
for(int j=0;j<hashMapLen;j++){
hash[j]=NULL;
}
//work
for(int i=0;i<numbersLen;i++){
//注意,求余在计算机语言中是可以出现负数的,因此要进行绝对值处理
int index=abs((numbers[i])%hashMapLen);
//下面逻辑思路与官方思路相同
if(hash[index]!=NULL){
HashMapHead temp = hash[index];
while(temp!=NULL){
if(numbers[temp->data]+numbers[i]==target){
result[0] = temp->data+1;
result[1] = i+1;
return result;
}
temp=temp->next;
}
int newIndex=abs((target-numbers[i])%hashMapLen);
addHashMapNode(&hash[newIndex],i);
}
else {
int newIndex=abs((target-numbers[i])%hashMapLen);
addHashMapNode(&hash[newIndex],i);
}
}
return result;
} 此处给出该方法的效率,并与官方的散列表法作比较,以校验性能没问题。 int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
// write code here
int size=2;
int* target_arr=(int*)malloc(sizeof(int)*size);
for(int i=0;i<numbersLen;i++)
{
if(numbers[i]>target+10)
{
continue;
}
for(int j=i+1;j<numbersLen;j++)
{
if(numbers[i]+numbers[j]==target)
{
target_arr[0]=i+1;
target_arr[1]=j+1;
}
}
}
*returnSize=size;
return target_arr; /**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型一维数组
* @param numbersLen int numbers数组长度
* @param target int整型
* @return int整型一维数组
* @return int* returnSize 返回数组行数
*
* C语言声明定义全局变量请加上static,防止重复定义
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
// write code here
int* retarray =(int*)malloc(2*sizeof(int));
unsigned int cnt1,cnt2,temp;
for(cnt1 = 0;cnt1<numbersLen-1;cnt1++){
if(numbers[cnt1]>target){
continue;
}
for(cnt2 = cnt1+1;cnt2<numbersLen;cnt2++){
if((numbers[cnt1]+numbers[cnt2])==target){
if(cnt1>cnt2){
temp = cnt1;
cnt2 = cnt1;
cnt1 = temp;
}
retarray[0] = cnt1+1;
retarray[1] = cnt2+1;
*returnSize = 2;
}
}
}
return retarray;
} 题目中有说明数据范围:
numbers 中是可能存在数为负数的……
搞不懂你们的答案都加了
if(numbers[i]>target) {
continue;
} 有什么用……
万一 numbers[j] 为负数呢?这时候还能跳过吗?
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
// write code here
int* ret=(int*)malloc(sizeof(int)*2);
if(numbersLen==0)
return NULL;
*returnSize=2;
int i,j;
for(i=0;i<numbersLen;i++)
{
if(numbers[i]>target)//排除自身已经大于目标的元素
continue;
for(j=i+1;j<numbersLen;j++)
{
if(numbers[i]+numbers[j]==target)
{
ret[0]=i+1;
ret[1]=j+1;
return ret;
}
}
}
return ret;
} int* twoSum(int* numbers, int numbersLen, int target, int* returnSize ) {
// write code here
int *result = malloc(8);
*returnSize = 2;
for(int i = 0; i < numbersLen; i++)
{
// 过滤本身已经超过target的值,可以节省很多时间
if(numbers[i]>target)
continue;
for(int j = i+1;j < numbersLen; j++)
if(numbers[i]+numbers[j] == target)
{
*result = i+1;
*(result+1) = j+1;
return result;
}
}
return NULL;
}
没有过滤时间那一步,答案过不了。