leetcode刷题日记:169. Majority Element(多数元素)和 171. Excel Sheet Column Number(Excel 表列序号)

169. Majority Element(多数元素)

坏办法

我不知道你看到这一道题目时想的是什么,我想的是创建一个大的数组然后去统计每一个元素出现的次数,这样我们就能够根据出现的次数去找出多数元素是哪一个元素,但是这一种方法的空间复杂度较高,因为我们不知道会出现多少个不相同的元素,所以我们事先进行开辟空间的时候就需要进行,事先进行一个估计,考虑到最坏的情况,我们的程序的空间复杂度会是 O ( n ) O(n) O(n),然后我们在遍历数组的时候记录下每一个元素出现的次数,在此期间需要频繁的进行查询操作(因为当前元素对应的次数存在开辟数组的哪个位置我们是不知道的),而在数组中进行查询操作的时间复杂度是 O ( n ) O(n) O(n)外层循环需要遍历n个元素,所以我们整个程序的时间复杂度会在 O ( n 2 ) O(n^2) O(n2),这显然效率比较低下。

好办法(注意使用条件)

我们想一下题目已经告诉我们了出现次数最多的哪一个元素在数组内出现的次数超过数组大小的一半。也就是说假设总共有x个元素的话,出现较多的元素的次数为m,其余元素出现的次数加起来为n,那么这三个数满足下面的关系:
m + n = x m > n m+n=x\\ m>n m+n=xm>n
也就是说 m − n > 0 m-n>0 mn>0
我们看一下我们在数最多出现的元素的过程中,假设我们当前记录的元素就是出现次数最多的元素,记录这个元素出现的次数,然后每当碰到与当前记录的元素相同的元素,元素出现的次数就加1,反之就减1,如果出现的次数为0了就更换当前记录的元素,这样到最后加加减减,因为出现次数最多的元素次数 m > n m>n m>n所以最后记录的一定是数组中出现最多的元素。
注意:这种方法只适用于下面这种情况 m > n m>n m>n
我们可以写出如下代码:

int majorityElement(int* nums, int numsSize) {
    int num = nums[0];
    int count = 0;
    for(int i = 0; i<numsSize; i++){
        if(count == 0){
            num = nums[i];
        }
        if(nums[i]==num){
            count++;
        }else{
            count--;
        }
    }
    return num;
}

运行结果截图:
leetcode刷题日记:169. Majority Element(多数元素)和 171. Excel Sheet Column Number(Excel 表列序号)_第1张图片

171. Excel Sheet Column Number(Excel 表列序号)

这一道题的姊妹题我已经分析过了,只需要反着进行操作就行了。
168. Excel Sheet Column Title(Excel表列名称)
可以写出下述代码:

int titleToNumber(char* columnTitle) {
    int length = strlen(columnTitle);
    for(int i=0; i<length/2;i++){
        char t = columnTitle[i];
        columnTitle[i] = columnTitle[length-i-1];
        columnTitle[length-i-1] = t;
    }
    int num = 0;
    for(int i=length-1; i>=0; i--){
        num *= 26;
        num += columnTitle[i] - 'A';
        num += 1;
    }
    return num;
}

运行结果截图:
leetcode刷题日记:169. Majority Element(多数元素)和 171. Excel Sheet Column Number(Excel 表列序号)_第2张图片

你可能感兴趣的:(leetcode刷题日记,leetcode,excel,算法)