力扣高频|算法面试题汇总(一):开始之前
力扣高频|算法面试题汇总(二):字符串
力扣高频|算法面试题汇总(三):数组
力扣高频|算法面试题汇总(四):堆、栈与队列
力扣高频|算法面试题汇总(五):链表
力扣高频|算法面试题汇总(六):哈希与映射
力扣高频|算法面试题汇总(七):树
力扣高频|算法面试题汇总(八):排序与检索
力扣高频|算法面试题汇总(九):动态规划
力扣高频|算法面试题汇总(十):图论
力扣高频|算法面试题汇总(十一):数学&位运算
力扣高频|算法面试题汇总(一):开始之前
力扣链接
目录:
- 1.只出现一次的数字
- 2.多数元素
- 3.搜索二维矩阵 II
- 4.合并两个有序数组
- 5.鸡蛋掉落
1.只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
特别要求:线性时间复杂度+不使用额外空间。
因此使用做差法,即异或,相同的数字经过异或运算后结果为0,除单独出现一次的数字外,其他数字都是出现两次的,那么这些数字经过异或运算后结果一定是0。而任何数字与0进行异或运算都是该数字本身。
C++
class Solution {
public:
int singleNumber(vector<int>& nums) {
// 使用异或操作
int num = 0;
for(auto itear = nums.cbegin(); itear < nums.cend(); ++itear)
num ^= *itear;
return num;
}
};
Python:
class Solution:
def singleNumber(self, nums: List[int]) -> int:
res = 0
for num in nums:
res ^= num
return res
2.多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
方法一:
使用哈希表,用哈希表来快速统计每个元素出现的次数。一边循环,一边记录数字重复的最大次数和最大值,保证时间复杂度 O ( n ) O(n) O(n)。
C++
class Solution {
public:
int majorityElement(vector<int>& nums) {
map<int, int> idCount;
int majorityNum = 0;// 记录出现次数最多的数字
int count = 0; // 记录出现的次数
for(int i = 0; i < nums.size(); ++i){
++idCount[nums[i]];
if(idCount[nums[i]] > count){
count = idCount[nums[i]];
majorityNum = nums[i];
}
}
return majorityNum