首页 > 其他分享 >LeetCode 面试经典150题---002

LeetCode 面试经典150题---002

时间:2024-04-07 13:33:26浏览次数:24  
标签:150 cnt nums int 元素 --- 002 数组 众数

### 169. 多数元素
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109
这题可太有意思了,意思就是找到众数,并且这个众数的个数是大于n/2的。方法很多,比如(1)哈希表,记录每个元素出现的次数,边记录边判断是否个数>n/2。(2)随机数,随机一个数,判断它的次数是否大于n/2。但是这两种方法属于是正常做法,作为不正常的我们自然要另辟蹊径。
这个数组其实存在这样一种性质,我们把数组中的元素分为两类,一类是众数,另一类是非众数。(1)我们删除一个众数和非众数,其实这个数组本身的性质仍然不变,即众数个数还是>n/2,说明这个操作没有影响。(2)我们删除两个不相等的非众数,数组性质还是不变,并且众数还比原来相对更多了,这是我们乐意看到的。那此时你就想问了,为什么不删除两个相等的数,因为我们的目的是通过两两相消不等的数,每次遇到相等的数就把它看作是众数,遇到不等的就两两相消,这样坐下来最后一定是留下的众数,因为众数的个数永远是最多的(参考刚刚说的两个性质)。

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

### 189. 轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
0 <= k <= 105
第一种方法,直接开辟一个新的数组,每个元素向右移动k个位置,使用(i + k) % n实现,如下所示:

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> temp(n);
        for(int i = 0;i < n;i ++ ){
            temp[(i + k) % n] = nums[i];
        }
        nums = temp;
    }
};

不过题目要求用O(1)的原地算法实现,也就是不能重新开辟数组。可以发现一个规律,最终的数组就是原数组的后k % n个元素移到前面,前n - k % n个元素移到后面,所以直接翻转原数组,然后分别对前后两端再翻转,如下所示:

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        k %= nums.size();
        reverse(nums.begin(), nums.end());
        reverse(nums.begin(), nums.begin() + k);
        reverse(nums.begin() + k, nums.end());
    }
};
题解还有一种环状替换的方法,没看懂先记录一下

标签:150,cnt,nums,int,元素,---,002,数组,众数
From: https://www.cnblogs.com/timeac-coder/p/18118863

相关文章

  • 边缘智能网关:企业数字化转型的助推器-天拓四方
    一、企业背景随着信息技术的飞速发展,企业对于数据处理和通信的需求日益增长。特别是在工业4.0、智能制造等领域,企业面临着海量的数据采集、实时分析、远程监控等挑战。传统的中心化数据处理模式已难以满足这些需求,企业需要寻求一种更加高效、灵活的数据处理方式。某专注于智......
  • 【办公类-21-14】 20240406三级育婴师 344道多选题 UIBOT下载+整理
     作品展示背景需求培训机构提供了两个理论学习素材问题:1、电子稿:打印页数很多,按章节,题型混在一起的,只有答案,没有说明,2、APP版,操作方便,有错题集,也只有答案,没有解析说明。但是APP只能一道题一道题看,不如纸质的可宏观看所有题。很多老师问我有没有分类(判断、多选、......
  • 数控机床采集网关助力企业实现智能化生产-天拓四方
    随着工业4.0时代的到来,智能制造成为制造业转型升级的重要方向。数控机床作为制造业的核心设备,其数据采集与监控对于提升生产效率、优化生产流程具有重要意义。本案例将介绍数控机床采集网关的应用,通过该网关实现数控机床数据的实时采集、传输与分析,助力企业实现智能化生产。案......
  • 【办公类-48-02】20240407每月电子屏台账汇总成docx-2(腾讯文档xlsx导入docx,每页20条)
    作品展示背景需求:安全主任再次催交台账一分园老师发的是链接版——这是我原来制作的在线共享填写“腾讯文档”。但是感觉手机竖版填写起来不方便,(表格是横版的,要向右滑动点击格子,填起来容易错行),所以我推荐使用问卷星填写了。腾讯文档里面是选择按钮填入信息,也是所有数据......
  • 前端的图表绘制框架Konva-基本介绍
    关于Konva及TS的基础这个Konva是一个HTML5的2D绘图库,应用它可以画出各种各样的二维图形来的。Konva.js-JavaScript2dcanvaslibrary MITLicense这个是用它创建的一些网站或者在线工具,还是挺有意思的。应用它的程序自然是多得多,但是我最近也是因缘际会,用到它了。不过像......
  • 2024清明节北斗课堂总结(4.4---4.6)
    背景通过学校老师的指引,我在清明节仅仅3天的假期内,上了长达18个小时的课程。课程虽然有一点点的累,但还是学到真本事的。Day1第一天,介绍是说上数据结构。本来我是认为会先将想栈、队列、链表等简单并可以用STL的数据结构,但一上来,就讲了树。另附:给我们讲课的是mrsrz。树的......
  • kube-apiserver限流机制原理
    Kubernetes的kube-apiserver组件提供了一种限流机制来保护API服务器不会因为过多的请求而过载。这是通过几种机制实现的,包括基于速率的限流(RBAC)和基于并发连接数的限流。基于速率的限流:kube-apiserver可以配置为限制来自每个用户的请求速率。这是通过--basic-auth-file参......
  • HTB-Archetype
    HTB-Archetype1.TASK1问题:哪个TCP端口托管着数据库服务器?识别运行数据库服务的端口,通常通过端口扫描(如使用nmap)来完成。nmap-sV10.129.57.230答案:14332.TASK2问题:通过SMB共享的非管理员共享的名称是什么?smbclient-L10.129.57.230答案:backups3.TASK3问题......
  • Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--可视化编辑pdf
    Pdfium.Net.Free支持.NETFramework4.0.NETFramework4.5.NETStandard2.0.Net8.0可以和PdfiumViewer.Free共同使用预览pdf,也可以直接引用Pdfium.Net.Free操作pdf,解决部分.NetCore调用的问题,Pdfium.Net.Free封装了现有Pdfium的函数,实现了部分操作pdf的功能,部分功......
  • 二叉树-统一迭代法
    迭代法实现的前中后序遍历,除了前序和后序相互关联,中序则是另一种风格。我们需要针对三种遍历方式实现统一风格的代码。如何统一风格:解决访问节点(遍历节点)和处理节点(将元素放进结果集)不一致的情况。将访问的节点放入栈中,把要处理的节点放入栈中但是做标记(紧接着放入一个空指针)......