LeetCode 169. 多数元素

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

1、自然能想到一次遍历,让不同的元素碰到就消失,这样最后剩下的就是大于一半的元素。在C和C++中,利用问号表达式,非常巧妙的减少了代码的长度。

C 复制代码
int majorityElement(int* nums, int numsSize) {
    int p=1;
    int some_num = nums[0];
    int count = 1;
    while (p<numsSize){
        if (count == 0) some_num = nums[p];
        count += nums[p] != some_num ? -1 : 1;
        p++;
    }
    return some_num;
}
C++ 复制代码
    int majorityElement(vector<int>& nums) {
        int some_num,count = 0;
        for (int num : nums){
            if (count == 0) some_num =num;
            count += some_num != num ? -1 : 1;
        }
        return some_num;
    }
};

2、go语言中,利用返回定义使得代码中可以直接返回

go 复制代码
func majorityElement(nums []int) (some_num int) {
    count := 0
    for _,num := range nums{
        if count == 0{
            some_num = num
        }
        if some_num != num {
            count--
        }else{
            count++
        }
    }
    return 
}

3、rust语言利用fold方法,fold是一个从左往右的迭代,把计算所有元素最终输出一个值,fold类似reduce,区别是fold允许初始化返回变量,而reduce默认返回变量的初始化是第一个元素。

Rust 复制代码
    pub fn majority_element(nums: Vec<i32>) -> i32 {
        nums.into_iter().fold((0,0),|(mut some_num,mut count),num|{
            if count == 0 {
                some_num = num;
            }
            count += if some_num != num {-1}else{1};
            (some_num,count)
        }).0
    }

4、为了减少if判断,还能把判断转为数学计算

Rust 复制代码
    pub fn majority_element(nums: Vec<i32>) -> i32 {
        nums.into_iter().fold((0,0),|(mut some_num,mut count),num|{
            if count == 0 {
                some_num = num;
            }
            count += 1 - 2 * (some_num != num) as i32;
            (some_num,count)
        }).0
    }
相关推荐
im_AMBER18 小时前
Leetcode 102 反转链表
数据结构·c++·学习·算法·leetcode·链表
AlenTech19 小时前
200. 岛屿数量 - 力扣(LeetCode)
算法·leetcode·职场和发展
散峰而望20 小时前
【算法竞赛】栈和 stack
开发语言·数据结构·c++·算法·leetcode·github·推荐算法
老鼠只爱大米21 小时前
LeetCode算法题详解 438:找到字符串中所有字母异位词
算法·leetcode·双指针·字符串匹配·字母异位词·滑动窗口算法
AlenTech21 小时前
198. 打家劫舍 - 力扣(LeetCode)
算法·leetcode·职场和发展
重生之后端学习21 小时前
21. 合并两个有序链表
java·算法·leetcode·链表·职场和发展
源代码•宸21 小时前
Leetcode—1266. 访问所有点的最小时间【简单】
开发语言·后端·算法·leetcode·职场和发展·golang
YuTaoShao1 天前
【LeetCode 每日一题】712. 两个字符串的最小ASCII删除和——(解法一)记忆化搜索
算法·leetcode·职场和发展
圣保罗的大教堂1 天前
leetcode 1266. 访问所有点的最小时间 简单
leetcode
源代码•宸1 天前
Leetcode—85. 最大矩形【困难】
经验分享·算法·leetcode·职场和发展·golang·单调栈