算法题
多数元素
169. 多数元素 - 力扣(LeetCode)
题目要求空间位O(1),时间为O(n)的方法
采用摩尔投票法解决,摩尔投票法是一种用于在数组中寻找多数元素的有效方法。所谓多数元素,是指在数组中出现次数超过一半以上的元素。
算法遍历数组并维护两个变量:多数元素量与投票数。先开始将第一个元素设置成候选元素,投票数为1
- 如果票数为0,将当前元素设为候选元素,并将票数设置为1。
- 如果当前元素等于候选元素,则票数加1。
- 如果当前元素不等于候选元素,则票数减1。
class Solution {
public:int majorityElement(vector<int>& nums) {int max_sum = nums[0];//将第一个元素先设置成多数元素int sum = 1;//记录个数for (int i = 1; i < nums.size(); i++) {if (nums[i] != max_sum) {//如果下一个值与当前多数元素值不等sum--;.//个数减一if (sum == 0) {//当个人为0的时候max_sum = nums[i];、、替换sum = 1;//个数重新统计成1}} else {sum++;//相等的时候个数加加}}return max_sum;}
};
基础知识
什么是 C++ 内联函数?
【C++】C++中内联函数详解(搞清内联的本质及用法)-CSDN博客
内联函数在形式上与普通函数结构相同,只是在函数前加上一个inline关键字
inline int sum(int a,int b){return a+b;
}
- 内联函数目的:代替部分 #define 宏定义;
- 使用内联函数替代普通函数的目的:提高程序的运行效率;
- 递归函数不能被设置成内联函数
它的作用是什么?
1. 替换宏定义
宏是预处理指令,在预处理的时候把所有的宏名用宏体来替换;
内联函数是函数,在编译阶段把所有调用内联函数的地方把内联函数插入;
宏没有类型检查,无论对还是错都是直接替换;而内联函数在编译时进行安全检查;
宏的编写有很多限制,例如只能写一行,不能使用return控制流程等;
对于C++ 而言,使用宏代码还有另一种缺点:无法操作类的私有数据成员。
2. 代替普通函数嵌入在代码中,提高程序的运行效率。
内联函数与普通函数有什么区别?
普通函数会频繁的开辟栈帧,系统开销大,为了消除函数调用的时空开销,C++ 提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数。但也存在缺点,就是每一调用处均会展开,增加了重复的代码量。
使用了内联函数,编译器也不一定会识别成内联函数,如果代码量过大的话,也不会被识别内联函数,还有递归函数不能设置成内联函数,