这道题目很简单,排序后将偶数位相加就可以了。但要求排序时间复杂度不能为O(n^2),所以可以选择快速排序。我一开始没想到用快速排序,使用的插入排序。runcode时提示runtime error。输入为[7,3,1,0,0,6]。我在本地使用vs2017测试正常,我手写验证也没有出界,很郁闷,盼望大神指导。
疑问已经解决,j值不可以为-1,也是醉了。。。。
以下为代码:
int arrayPairSum(int* nums, int numsSize) {
int i, j, key;
for (i = 1; i < numsSize; i++)
{
key = nums[i];
j = i - 1;
while (nums[j] > key&&j >= 0)
{
nums[j + 1] = nums[j];
j--;
}
nums[j+1] = key;
}//插入排序
key = 0;
for (i = 0; i < numsSize; i = i + 2)
key = key + nums[i];
return key;
}
以下是快速排序的解决方案:
int partition(int *nums,int low,int high)
{
int pivot=nums[low];
while(low<high)
{
while(low<high&&nums[high]>=pivot) high--;
nums[low]=nums[high];
while(low<high&&nums[low]<=pivot) low++;
nums[high]=nums[low];
}
nums[low]=pivot;
return low;
}
void quickSort(int *nums,int low,int high)
{
if(low>=high)
return;
int pivot=partition(nums,low,high);
quickSort(nums,low,pivot-1);
quickSort(nums,pivot+1,high);
}
int arrayPairSum(int* nums, int numsSize) {
quickSort(nums,0,numsSize-1);
int key=0;
int i;
for (i = 0; i < numsSize; i = i + 2)
key = key + nums[i];
return key;
}