maxOccuringDigit() 函数的时间和空间复杂度是多少?

时间:2021-01-21 07:54:20

标签: java arrays function time-complexity big-o

static int maxOccuringDigit(int n) {
    int tempNum = n;
    if (tempNum < 0)
        tempNum = -tempNum;

    int[] count = new int[10];

    while (tempNum != 0) {
        int rem = tempNum % 10;
        count[rem] = count[rem] + 1;
        tempNum = tempNum / 10;
    }

    int maxCount = count[0];
    int digit = 0;
    for (int i = 1; i < count.length; i++) {
        if (count[i] > maxCount) {
            maxCount = count[i];
            digit = i;
        } else if (count[i] == maxCount)
            digit = -1;
    }
    return digit;
}

任务是找出出现次数最多的数字。我需要帮助来分析这个函数的时间复杂度。我认为它应该是 O(k) 其中 k 是给定数字 n 中的总位数。 主要是我对这里使用的for循环的时间复杂度很好奇。由于它总是循环10次,我们可以将其视为恒定时间操作吗?

所以总共 O(k + 10) ~ O(k) 时间。对吗?

对于空间复杂度,它只使用了 10 个额外的数组空间,那么它的空间复杂度又是多少?

2 个答案:

答案 0 :(得分:1)

while 循环将运行 log10(N) 次。是的,for 循环为 N 运行一次,并且它运行 10 次这一事实可以忽略不计,即 C = 10。

因此,您的方法的运行时复杂度为 log10(N) + C,由于 C 可以忽略不计,因此 log10(N) 是其运行时复杂度。

空间复杂度为 O(1)

答案 1 :(得分:1)

第一个循环取决于位数,k,并且是 O(k)。第二个循环取决于 count 数组中的元素数,即 10。由于这是一个常量,因此它在 O(1) 中运行。因此,总时间复杂度为 O(k)

空间复杂度为 O(1) 的原因与第二个循环的时间复杂度为 O(1) 的原因相同。