【LeetCode】169. 多数元素

摘要:
主题链接:169。大多数元素的描述:给定大小为n的数组,查找大部分元素。大多数元素是指在数组中出现超过n/2次的元素。ClassSolution{publicitmajorityElement{Arrays.sort;returnnums[nums.length/2];}}方法2:堆栈数组中的数字出现的时间超过一半,也就是说,它出现的次数超过所有其他数字的总和。有三种情况:堆栈为空并被推送;堆栈顶部的元素等于当前元素;否则,堆栈将被推送。最后,堆栈顶部的元素是需求。修改罐,计数++;堆栈的顶部元素等于当前元素。

题目链接:

169. 多数元素

题目描述:

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

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

示例:

示例 1:

输出:[3,2,3]
输出:3

示例 2:

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

思路:

方法一:排序

如果数组中有一个数字出现的次数大于 n / 2,那么将数组排序之后,位于数组中间的数字一定就是那个出现次数超过一半的数字。

class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }
}

方法二:栈

数组中一个数字出现的次数大于一半,也就是说,它出现的次数比其他所有数字出现的次数和还要多。那么我们可以用栈来记录。分 3 种情况:

  1. 栈为空,入栈;
  2. 栈顶元素等于当前元素,入栈;
  3. 否则,出栈。

最后栈顶元素即是所求。

class Solution {
    public int majorityElement(int[] nums) {
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < nums.length; i++) {
            if (stack.empty()) {
                stack.push(nums[i]);
            } else if (stack.peek() == nums[i]) {
                stack.push(nums[i]);
            } else {
                stack.pop();
            }
        }
        return stack.peek();
    }
}

方法三:方法二的优化

方法二中用栈的目的就是为了记录,其实并不需要真的构造一个栈,只需要一个“虚拟”的栈就可以达到目的。

可以设置一个变量 cand 表示当前栈中的元素,用另一个变量 count 表示当前栈中元素的个数,其实就是 cand 的个数。3 种情况同上:

  1. 栈空,入栈。修改 candcount++
  2. 栈顶元素等于当前元素,入栈。不用修改 candcount++
  3. 否则,出栈。count--

最后 cand 即是所求。

class Solution {
    public int majorityElement(int[] nums) {
        int cand = nums[0], conut = 0;
        for (int i = 0; i < nums.length; i++) {
            if (conut == 0) {
                cand = nums[i];
                conut ++;
            } else if (cand == nums[i]) {
                conut ++;
            } else {
                conut --;
            }
        }
        return cand;
    }
}

免责声明:文章转载自《【LeetCode】169. 多数元素》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C语言:字符数组 + 字符串指针qt creator编译问题之 can not find -lQtGui下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

jmeter监控内存,CPU等方法

当然,我们也可以选择本地进程下的远程进程来获取服务器的内存使用情况和其他信息。在文本框中输入需要测试的服务器的IP地址:port,然后在下面输入用户名和密码。单击“连接”以查看发生的情况。...

CommonJS规范

NodeJS是本规范的实现。环境、运行、JSGILocaland远程包和包管理关于每个子规范的具体定制进度,请参考官方网站描述:Apache CouchDB和node.js。然而,这些项目中的大多数只实现了CommonJS的一些规范。具体项目及实施请参见官方网站描述:http:...

selenium自动化之鼠标操作

,selenium为我们提供了一个处理此类事件的类——ActionChains。ActionChains可以模拟鼠标操作,例如单击、双击、右键单击、拖动等。鼠标移动时演示页面的截图:demo1.使用鼠标移动到WriteonOver按钮的顶部。python脚本如下:读取鼠标移动代码,首先定义浏览器驱动程序,最大化窗口,打开测试页面URL,定位到测试按钮顶部,定...

JavaMail给QQ邮箱发邮件报错

org.springframework.mail.MailAuthenticationException:身份验证失败;nestedexceptionisjavax.mail.AuthenticationFailedException:535错误:http://service.mail.qq.com/cgi-bin/help?subtype=1&&a...

SQL中一次插入多条数据

SQL中insert一次可以插入一条数据,我们有三种方法可以一次性插入多条数据。在此处还有一些有趣的问题,当我使用以下代码来插入多条数据时:selecttop0*intonewstudentfromstudentinsertintonewstudentselect*fromstudent这里会发生这样的报错:因为NewClass表中ClassId为标识列,所...

The server selected protocol version TLS10 is not accepted by client preferences [TLS12]

修改jre中的这个文件:/java/jdk1.8/jre/lib/security/java.securityjdk.tls.legacyAlgorithms直接改成下面的这个:jdk.tls.legacyAlgorithms=SSLv3,RC4,DES,MD5withRSA,DHkeySize˂1024,ECkeySize˂224,anon,NULL,in...