Leetcode 561 . Array Partition I 关于插入排序的疑问

这道题目很简单,排序后将偶数位相加就可以了。但要求排序时间复杂度不能为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;
}

猜你喜欢

转载自blog.csdn.net/sinat_37372543/article/details/88011555