一个时间复杂度和空间复杂度限定的问题

发布于 2022-08-26 18:42:49 字数 191 浏览 11 评论 0

待字闺中的微信公共帐号上看到的,时间复杂度O(n)、空间复杂度O(n)能想出来。O(1)的想不出来呀。

给定数组A,大小为n,数组元素为1到n的数字,不过有的数字出现了多次,有的数字没有出现。请给出算法和程序,统计哪些数字没有出现,哪些数字出现了多少次。能够在O(n)的时间复杂度,O(1)的空间复杂度要求下完成么?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

薄情伤 2022-09-02 18:42:49

算法代码,Python

# encoding: utf-8
'''
Created on 2013年9月13日
'''
import sys

def main():
    a = [1, 2, 3, 4, 4, 6, 7, 7, 9]

    n = len(a)
    for k, v in enumerate(a):
        a[k] = v * n
    print a

    for k, v in enumerate(a):
        a[(v / n - 1)] += 1

    print a

    for k,v in enumerate(a):
        a[k] = a[k]%n

    omitted = []
    duplicated = []
    for k,i in enumerate(a):
        if i < 1:
            omitted.append(k+1)
        elif i > 1:
            duplicated.append(k+1)

    print omitted
    print duplicated


if __name__ == '__main__':
    sys.exit(main())
成熟稳重的好男人 2022-09-02 18:42:49

时间复杂度为o(n),空间复杂度为o(n)是利用hash思想,这里既然要求空间复杂度为o(1),那就可以从数组A本身做文章,原文链接:http://www.ituring.com.cn/article/55331,简单来说,让数组A的每个数表示为A[i]=n*org + num的形式
写一个c实现的代码:

/**
 * 给定数组A,大小为n,数组元素为1到n的数字,不过有的数字出现了多次,有的数字没有出现。请给出算法和程序,统计哪些数字没有出现,哪些数字出现了多少次
 * 时间复杂度为O(N),空间复杂度为O(1)
 */

#include <stdio.h>
#include <stdlib.h>

void calCount(int *arr, int n)
{
    int i;

    for (i = 1; i <= n; i ++)
        arr[i] *= n;

    for (i = 1; i <= n; i ++)
        arr[arr[i] / n] += 1;

    // 打印出现次数
    for (i = 1; i <= n; i ++) {
        printf("%d出现次数为%d\n", i, arr[i] % n);
    }
}


int main(void)
{
    int i, n, *arr;

    while (scanf("%d", &n) != EOF) {
        arr = (int *)malloc(sizeof(int) * (n + 1));

        for (i = 1; i <= n; i ++)
            scanf("%d", arr + i);

        calCount(arr, n);

        free(arr);
    }

    return 0;
}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文