#我被时间,空间卡了好久

两个方面,1.用时间复杂度最小的排序算法。

2.排序好后,再双指针遍历一遍。时间复杂度(n),原来的是n平方。

答案在最后。

#include <stdio.h>

#include<malloc.h>

// 先排序,然后两个指针从中间往两边移动,直到指针所指的只差比k大

// 只是,这种情况 4 2

// 1 1 4 4

// 阁下如何应对?

int main() {

    int n;

    int k;

    scanf("%d", &n);

    scanf("%d", &k);

    int* array = (int*)malloc(sizeof(int ) * n);

    for (int i = 0; i < n; i++) {

        scanf("%d", &array[i]);

    }

// for(int i = 0;i<n;i++){

//     printf("%d",array[i]);

// }

// 排序

    for (int i = n; i > 0; i--) {

        for (int j = 0; j + 1 < i; j++) {

            if (array[j] > array[j + 1]) {

                int tmp = array[j];

                array[j] = array[j + 1];

                array[j + 1] = tmp;

            }

        }

    }

// for(int i = 0;i<n;i++){

//     printf("%d",array[i]);

// }

    int maxNum = 0;

// 两指针从中间开始

    if (n % 2) {

        // 单数

        maxNum = 1;

        int point = (n - 1) / 2 - 1 + 1 - 1;

        int point2 = (n - 1) / 2 - 1 + 1 + 1;

        for (; point >= 0 && point2 <= n - 1;) {

            if (k >= array[point2] - array[point]) {

                maxNum = maxNum + 2;

            } else {

                int g = point2 - 1;

                int y = point + 1;

                if (k >= array[g] - array[point] || k >= array[point2] - array[y]) {

                    maxNum = maxNum + 1;

                }

                break;

            }

            point--;

            point2++;

        }

    } else {

        // 双数

        int point = n / 2 - 1;

        int point2 = n / 2;

        for (; point > 0 && point2 < n - 1;) {

            if (k >= array[point2] - array[point]) {

                maxNum = maxNum + 2;

            } else {

                int g = point2 - 1;

                int y = point + 1;

                if (k >= array[g] - array[point] || k >= array[point2] - array[y]) {

                    maxNum = maxNum + 1;

                }

                break;

            }

            point--;

            point2++;

        }

    }

    printf("%d", maxNum);

    return 0;

}

// 解法更新

#include <stdio.h>

#include<malloc.h>

//只是 4 3 , 2 1 4 4 ,这种情况,阁下如何应对?

int main() {

    int n;

    int k;

    scanf("%d", &n);

    scanf("%d", &k);

    int* array = (int*)malloc(sizeof(int ) * n);

    for (int i = 0; i < n; i++) {

        scanf("%d", &array[i]);

    }

// for(int i = 0;i<n;i++){

//     printf("%d",array[i]);

// }

    int max = 0;

    for (int i = 0; i < n; i++) {

        int tmp = 0;

        int min = array[i];

        for (int j = i ;  j < n; j++ ) {

            if (min - array[j] >= -k && min - array[j] <= k ) {

                tmp++;

                min = array[j] < min ? array[j] : min;

            }

        }

        max = max > tmp ? max : tmp;

    }

    printf("%d", max);

    return 0;

}

#include <stdio.h>

#include<malloc.h>

#include <stdlib.h>

void QuickSort(int* arr, int low, int high) {

    if (low < high) {

        int i = low;

        int j = high;

        int k = arr[low];

        while (i < j) {

            while (i < j && arr[j] >= k) {  // 从右向左找第一个小于k的数

                j--;

            }

            if (i < j) {

                arr[i++] = arr[j];

            }

            while (i < j && arr[i] < k) {   // 从左向右找第一个大于等于k的数

                i++;

            }

            if (i < j) {

                arr[j--] = arr[i];

            }

        }

        arr[i] = k;

        // 递归调用

        QuickSort(arr, low, i - 1);     // 排序k左边

        QuickSort(arr, i + 1, high);    // 排序k右边

    }

}

   

    int main() {

        int n;

        int k;

        scanf("%d", &n);

        scanf("%d", &k);

        int* array = (int*)malloc(sizeof(int ) * n);

        for (int i = 0; i < n; i++) {

            scanf("%d", &array[i]);

        }

QuickSort(array,0,n-1);

int max = 0;

for(int i = 0;i<n;i++){

max=0;

for(int j = i;j<n&&array[j]-array[i]>k;j++){

max++;}}

//这个超时,不知阁下该如何应对

        printf("%d", max);

        return 0;

    }

// 都可以通过的

#include <stdio.h>

#include<malloc.h>

#include <stdlib.h>

void QuickSort(int* arr, int low, int high) {

    if (low < high) {

        int i = low;

        int j = high;

        int k = arr[low];

        while (i < j) {

            while (i < j && arr[j] >= k) {  // 从右向左找第一个小于k的数

                j--;

            }

            if (i < j) {

                arr[i++] = arr[j];

            }

            while (i < j && arr[i] < k) {   // 从左向右找第一个大于等于k的数

                i++;

            }

            if (i < j) {

                arr[j--] = arr[i];

            }

        }

        arr[i] = k;

        // 递归调用

        QuickSort(arr, low, i - 1);     // 排序k左边

        QuickSort(arr, i + 1, high);    // 排序k右边

    }

}

   

    int main() {

        int n;

        int k;

        scanf("%d", &n);

        scanf("%d", &k);

        int* array = (int*)malloc(sizeof(int ) * n);

        for (int i = 0; i < n; i++) {

            scanf("%d", &array[i]);

        }

QuickSort(array,0,n-1);

        int r = 0;

        int l = 0;

        int max = 1;

        while (r < n) {

            if (array[r] - array[l] > k) {

                l++;

            }

            max = max > r - l + 1 ? max : r - l + 1;

            ++r;

        }

        printf("%d", max);

        return 0;

    }