题目描述:
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
void QuickSort(int *nums, int start, int end)
{
int i=start;
int j=end;
int index = nums[i];
if(start >= end)
{
return;
}
while(i<j)
{
while(i<j&&index<=nums[j])
{
j--;
}
nums[i]=nums[j];
while(i<j&&nums[i]<=index)
{
i++;
}
nums[j]=nums[i];
}
nums[i]=index;
QuickSort(nums, 0, i-1);
QuickSort(nums, i+1, end);
}
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int i = 0, j = 0, k=0;
int *back = (int *)malloc(sizeof(int)*2);
if(numsSize == 0 || numsSize == 1)
{
return NULL;
}
#if 1 //方法1:暴力法 时间复杂度O(n²) 运行正常
for(i=0;i<numsSize;i++)
{
for(j=i+1;j<numsSize;j++)
{
if(nums[i]+nums[j] == target)
{
back[0]=i;
back[1]=j;
*returnSize = 2;
return back;
break;
}
}
}
#endif
#if 0 //方法2:hash法 时间复杂度O(n²) 但是不能运行带负数的[-3,4,3,90]0
int max = nums[0];
for(i=1;i<numsSize;i++)
{
if(nums[i]>max)
{
max = nums[i];
}
}
int temp[max+1];
for(i=0;i<max+1;i++)
{
//max+1是为了开辟足够空间,初始化
temp[i]=-1;
}
for(i=0;i<numsSize;i++)
{
//数组元素作为下标,数组下标作为值
temp[nums[i]]=i;
}
for(i=0;i<numsSize;i++)
{
//i != temp[target-nums[i]]是应对元素作为下标的值与该元素原来的位置下标值一样情况
if(temp[target-nums[i]]!=-1 && i != temp[target-nums[i]])
{
back[0] = i;
back[1] = temp[target-nums[i]];
*returnSize = 2;
return back;
}
}
#endif
#if 0 //方法3:双指针,类似于快速排序 但是返回的下标不是原来的
QuickSort(nums, 0, numsSize-1);
for(i=0;i<numsSize;i++)
printf("%d ", nums[i]);
i=0;
j=numsSize-1;
while(i<j)
{
if(nums[i]+nums[j]>target)
{
j--;
}
else if(nums[i]+nums[j]<target)
{
i++;
}else{
back[0]=i;
back[1]=j;
*returnSize = 2;
return back;
}
}
#endif
*returnSize = 0;
return back;
}
leetcode-简单-c语言-两数之和-20210731
最新推荐文章于 2024-01-18 22:55:30 发布