力扣高频|算法面试题汇总(一):开始之前

力扣高频|算法面试题汇总(一):开始之前
力扣高频|算法面试题汇总(二):字符串
力扣高频|算法面试题汇总(三):数组
力扣高频|算法面试题汇总(四):堆、栈与队列
力扣高频|算法面试题汇总(五):链表
力扣高频|算法面试题汇总(六):哈希与映射
力扣高频|算法面试题汇总(七):树
力扣高频|算法面试题汇总(八):排序与检索
力扣高频|算法面试题汇总(九):动态规划
力扣高频|算法面试题汇总(十):图论
力扣高频|算法面试题汇总(十一):数学&位运算

力扣高频|算法面试题汇总(一):开始之前

力扣链接
目录:

  • 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值