美文网首页
496. 下一个更大元素 I [力扣挑战]

496. 下一个更大元素 I [力扣挑战]

作者: 阵雨小朋友 | 来源:发表于2020-02-16 15:57 被阅读0次

    给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。

    nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。

    示例 1:

    输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
    输出: [-1,3,-1]
    解释:
    对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。
    对于num1中的数字1,第二个数组中数字1右边的下一个较大数字是 3。
    对于num1中的数字2,第二个数组中没有下一个更大的数字,因此输出 -1。
    示例 2:

    输入: nums1 = [2,4], nums2 = [1,2,3,4].
    输出: [3,-1]
    解释:
    对于num1中的数字2,第二个数组中的下一个较大数字是3。
    对于num1中的数字4,第二个数组中没有下一个更大的数字,因此输出 -1。
    注意:

    nums1和nums2中所有元素是唯一的。
    nums1和nums2 的数组大小都不超过1000。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/next-greater-element-i
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    执行用时 :72 ms, 在所有 C 提交中击败了6.39%的用户
    内存消耗 :7.5 MB, 在所有 C 提交中击败了84.36%的用户

    void printAll(int* nums, int numsSize){
        for(int i=0; i<numsSize; i++){
            printf("%d ",nums[i]);
        }
        printf("\n");
    }
    
    void exchange(int *nums,int idx,int idx2){
        int tmp = nums[idx];
        nums[idx] = nums[idx2];
        nums[idx2] = tmp;
    }
    
    
    int *sortResult(int* nums,int numSize){
        int * originIdx = calloc(sizeof(int), numSize);
        if (!originIdx) {
            return NULL;
        }
        for (int i=0; i<numSize; i++) {
            originIdx[i] = i;
        }
    
        for (int i=0; i<numSize; i++) {
            int allSort = 1;
            for (int j=0; j<numSize-i-1; j++) {
                if(nums[j] > nums[j+1]){
                    exchange(nums, j, j+1);
                    exchange(originIdx, j, j+1);
                    allSort = 0;
                }
            }
    //        printf("%d->",i);
    //        printAll(nums, numSize);
            if (allSort) {
                break;
            }
        }
        return originIdx;
    }
    
    // 如果都已经遍历完就不需要比较
    int checkNeedCompare(int *flags, int count){
        if (!flags) {
            return 0;
        }
        int need = 0;
        for (int i=0; i<count; i++) {
            if (flags[i] == 0) {
                need = 1;
                break;
            }
        }
        return need;
    }
    
    int* nextGreaterElement(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
    
    //    printf("original num->");
    //    printAll(nums1, nums1Size);
    
        int *originIdx = sortResult(nums1,nums1Size);
    //    printf("originIdx->");
    //    printAll(originIdx, nums1Size);
        // 创建初始化标志
        int *flags = calloc(sizeof(int), nums1Size);
        if (!flags) {
            free(originIdx);
            return NULL;
        }
        for (int i=0; i<nums1Size; i++) {
            flags[i] = 0;
        }
    
        // 创建初始化结果记录
        int *tmpResult = calloc(sizeof(int), nums1Size);
        if (!tmpResult) {
            free(originIdx);
            free(flags);
            return NULL;
        }
        for (int i=0; i<nums1Size; i++) {
            tmpResult[i] = -1;
        }
    
        // 倒序比较各个数值.
        for (int i=nums2Size-1; i>=0; i--) {
    
            if (!checkNeedCompare(flags, nums1Size)) {
                break;
            }
    
            for (int j=0; j<nums1Size; j++) {
                if (flags[j] == 1) {
                    continue;
                }
                if(nums1[j] == nums2[i]){
                    flags[j] = 1;
                    break;
                } else if(nums1[j] < nums2[i]){
                    tmpResult[j] = nums2[i];
                } else{
                    break;
                }
            }
        }
    
        *returnSize = nums1Size;
    
        // 创建初始化结果记录
        int *result = calloc(sizeof(int), nums1Size);
        if (!result) {
            free(originIdx);
            free(flags);
            free(tmpResult);
            return NULL;
        }
    
    //    printAll(originIdx, nums1Size);
    //    printAll(tmpResult, nums1Size);
    
        // 记录最早的顺序情况.
        for (int i=0; i<nums1Size; i++) {
            result[originIdx[i]] = tmpResult[i];
        }
        free(originIdx);
        free(flags);
        free(tmpResult);
        return result;
    }
    

    相关文章

      网友评论

          本文标题:496. 下一个更大元素 I [力扣挑战]

          本文链接:https://www.haomeiwen.com/subject/ayzpfhtx.html