Leetcode刷题——查找与排序部分题目汇总(一)

146 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

查找遍历

169. 多数元素

题目

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

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

示例 1:

输入:[3,2,3] 输出:3 示例 2:

输入:[2,2,1,1,1,2,2] 输出:2

进阶:

尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ma…

分析

如果只是暴力搜索的话无法满足进阶要求,采用“消去”的思路,这里我们用nub表示暂时的众数,cnt来作为统计。如果遍历到的数是当前的众数cnt+1,如果不是cnt-1,如果cnt为0说明之前的所有的数都被抵消过了,应该将当前的数设置为众数

代码

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int nub;
        int cnt=0;
        for(int i=0; i < nums.size(); i++){
            if(cnt==0){
                nub = nums[i];
            }
            if(nub==nums[i]){
                cnt++;
            }else{
                cnt--;
            }
        }
        return nub;
    }
};

219. 存在重复元素 II

题目

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。

示例 1:

输入:nums = [1,2,3,1], k = 3 输出:true 示例 2:

输入:nums = [1,0,1,1], k = 1 输出:true 示例 3:

输入:nums = [1,2,3,1,2,3], k = 2 输出:false

提示:

109<=nums[i]<=1090<=k<=105-10^9 <= nums[i] <= 10^9 \\ 0 <= k <= 105

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/co…

分析

如果用暴力的方式解题就直接运用循环进行查询即可,但是我们可以用滑动窗口的方式将时间复杂度降为O(n)。

用map记录数组中的数字出现的位置,当这个数字再次出现时求一下他们位置的差值,并且更新map的值。

代码

class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        set<int> s;
        map<int, int> m;
        for(int i=0; i < nums.size(); i++){
            if(s.count(nums[i])==0){
                s.insert(nums[i]);
                m[nums[i]] = i;
            }else{
                if(i - m[nums[i]] <= k){
                    return true;
                }else{
                    m[nums[i]] = i;
                }
            }
        }
        return false;
    }
};

717. 1比特与2比特字符

有两种特殊字符:

第一种字符可以用一个比特 0 来表示 第二种字符可以用两个比特(10 或 11)来表示、 给定一个以 0 结尾的二进制数组 bits ,如果最后一个字符必须是一位字符,则返回 true 。

示例 1:

输入: bits = [1, 0, 0] 输出: true 解释: 唯一的编码方式是一个两比特字符和一个一比特字符。 所以最后一个字符是一比特字符。

示例 2:

输入: bits = [1, 1, 1, 0] 输出: false 解释: 唯一的编码方式是两比特字符和两比特字符。 所以最后一个字符不是一比特字符。

提示:

1 <= bits.length <= 1000 bits[i] == 0 or 1

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/1-…

分析

由于题目要求最后一位为0,所以我们遍历时应该从0位到n-2位,并且如果bits[i]==1说明它是一个2位数,i应该增加2,如果bits[i]==0说明它是一个1位数,i应该增加1

代码

class Solution {
public:
    bool isOneBitCharacter(vector<int> &bits) {
        int n = bits.size(), i = 0;
        while (i < n - 1) {
            i += bits[i] + 1;
        }
        return i == n - 1;
    }
};