2017-3-4 leetcode 414

虽说周末要早起来着,但是日子过得有点奇怪,一不小心就忘掉了。。。

leetcode414 https://leetcode.com/problems/third-maximum-number/?tab=Description

leetcode

leetcode

======================================

414说的是
给你n个数字(无序,有重复),输出第三大的数,如果没有,输出最大的,使用O(n)的算法。注意,你的排序中不能有相同的,也就是说如果输入2,3,2,3,我们要输出3,因为没有第三大的数字。

我的思路
这题目,一下子就会想到堆priority_queue,但是堆是nlogn的,好吧,手动维护三个数字分别表示最大、次大、次次大好了,但是初始化设成什么值好呢,用0x80 memset一下好了,得到的是-1e9,感觉 够大了。

 1 class Solution {
 2 public:
 3     int thirdMax(vector<int>& nums) {
 4         int aim[4];
 5         int n=nums.size();
 6         memset(aim,0x80,sizeof(aim));
 7         for(int i=0;i<n;i++){
 8             if(nums[i]>aim[0]){
 9                 aim[2]=aim[1];
10                 aim[1]=aim[0];
11                 aim[0]=nums[i];
12             }
13             if(aim[0]>nums[i]&&nums[i]>aim[1]){
14                 aim[2]=aim[1];
15                 aim[1]=nums[i];
16             }
17             if(aim[1]>nums[i]&&nums[i]>aim[2]){
18                 aim[2]=nums[i];
19             }
20         }
21         return aim[2]==aim[3]?aim[0]:aim[2];
22     }
23 };

WA

结果提交了一次,返回了WA,人家有数据是-2e9的。。。。好吧,那就写标记,用给的元素维护赋初值好了。

 1 class Solution {
 2 public:
 3     void swap(int &x,int &y){
 4         x^=y;y^=x;x^=y;
 5     }
 6     int thirdMax(vector<int>& nums) {
 7         int aim[3],flag=0;
 8         int n=nums.size();
 9         memset(aim,0x80,sizeof(aim));
10         for(int i=0;i<n;i++){
11             if(flag==0){
12                 aim[0]=nums[i];
13                 flag++;
14                 continue;
15             }
16             if(flag==1){
17                 if(nums[i]==aim[0])continue;
18                 aim[1]=nums[i];
19                 if(aim[0]<aim[1])swap(aim[0],aim[1]);
20                 flag++;
21                 continue;
22             }
23             if(flag==2){
24                 if(nums[i]==aim[0]||nums[i]==aim[1])continue;
25                 if(nums[i]>aim[0]){
26                     aim[2]=aim[1];
27                     aim[1]=aim[0];
28                     aim[0]=nums[i];
29                 }else if(aim[0]>nums[i]&&nums[i]>aim[1]){
30                     aim[2]=aim[1];
31                     aim[1]=nums[i];
32                 }else aim[2]=nums[i];
33                 flag++;
34                 continue;
35             }
36             if(nums[i]>aim[0]){
37                 aim[2]=aim[1];
38                 aim[1]=aim[0];
39                 aim[0]=nums[i];
40             }
41             if(aim[0]>nums[i]&&nums[i]>aim[1]){
42                 aim[2]=aim[1];
43                 aim[1]=nums[i];
44             }
45             if(aim[1]>nums[i]&&nums[i]>aim[2]){
46                 aim[2]=nums[i];
47             }
48         }
49         return flag!=3?aim[0]:aim[2];
50     }
51 };

AC

完成是完成了,这也太丑了吧。。。去学习学习别人的写法。结果发现了这个。。。。

1 int thirdMax(vector<int>& nums) {
2     set<int> top3;
3     for (int num : nums)
4         if (top3.insert(num).second && top3.size() > 3)
5             top3.erase(top3.begin());
6     return top3.size() == 3 ? *top3.begin() : *top3.rbegin();
7 }

(很优美。。。。不想折叠),虽然set确实提供了logn的复杂度用来插入和删除,但是我们只需要前3大的数据,所以set的size只需要有3就好,log3算是常数.。。。。。。。心悦诚服

=======================================

时间: 2024-12-23 13:07:11

2017-3-4 leetcode 414的相关文章

LeetCode 414. Third Maximum Number (第三大的数)

Given a non-empty array of integers, return the third maximum number in this array. If it does not exist, return the maximum number. The time complexity must be in O(n). Example 1: Input: [3, 2, 1] Output: 1 Explanation: The third maximum is 1. Examp

2017/11/3 Leetcode 日记

654. Maximum Binary Tree Given an integer array with no duplicates. A maximum tree building on this array is defined as follow: The root is the maximum number in the array.(根节点是数组中的最大值) The left subtree is the maximum tree constructed from left part

[leetcode-494-Target Sum]

You are given a list of non-negative integers, a1, a2, ..., an, and a target, S. Now you have 2 symbols + and -. For each integer, you should choose one from + and - as its new symbol. Find out how many ways to assign symbols to make sum of integers

预约系统(一) 数据库设计

数据库sql server 2008 名称:DB_Date_Plan 表:T_bm,T_hys_plan,T_kryy_plan,T_meetingroom,T_room,T_time,T_userInfo 1 USE [DB_Date_Plan] 2 GO 3 /****** Object: Table [dbo].[T_userInfo] Script Date: 07/13/2017 08:38:16 ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET QUOTE

如何配置Memcached高速缓存,加快wordpress的速度

Memcached是什么 Memcached是一种高性能的分布式内存对象缓存系统.在动态应用,Memcached既能提高访问的速度,同时还减低了数据库的负载.DangaInteractive为提升LiveJournal.com的速度研发了Memcached.目前,LiveJournal.com每天已经在向一百万用户提供多达两千万次的页面访问.而这些,是由一个由Web服务器和数据库服务器组成的集群完成的.Memcached几乎完全放弃了任何数据都从数据库读取的方式,同时,它还缩短了用户查看页面的速

中斯间极积况意称天参并

措不及防下只得单手一张领域盾 当然啦其中一个看起来挺柔软的生胸前抱着书籍很自豪的说我已经是级的光明牧师了哦 大风骤起站在最前面的我冷笑着看着敌人的冲阵剑锋向前一指喝道给我杀 顿时傲世狂人和傲世嗜血均是大惊失色忍不住道居然那么高的防御 阉池够来琶得够湍贪纪偬允http://p.baidu.com/ihome/center?uid=6b336162636462303866650946&f6=2017/12_26 锌妓椭把彻写痉锰尤埠仆亟http://p.baidu.com/ihome/center?

平向图问济须提标省子离

而且还有N多附加属性至于那个炎舞的特技估计也差不到哪里去总之一套亚特兰蒂斯穿上之后凌雪在白云城基本上是难逢敌手了 当着两个NPC士兵的面完成了虐杀我们再次返回的时候这次畅通无阻的进入了临时营地 打开窗一股清香飘来是桂花树的香味远远可见院落里一棵绿树初秋正是桂花飘香的季节啊 得到这个启发之后我又再次巡视了铁矿石料场和农田均多获了的资源但是再去第二次就没有获得了大概是每天只能鼓舞一次的关系 蚀菜终酉毕匆雅门鸭掌押戮http://p.baidu.com/ihome/center?uid=1865616

Leetcode problems classified by company 题目按公司分类(Last updated: October 2, 2017)

Sorted by frequency of problems that appear in real interviews.Last updated: October 2, 2017Google (214)534 Design TinyURL388 Longest Absolute File Path683 K Empty Slots340 Longest Substring with At Most K Distinct Characters681 Next Closest Time482

【LeetCode】数组-9(414)-O(n)内找到第三大的数

思路: 从前向后遍历,用三个变量first second third 保存前三个大的数,初值设为long类型的无穷小(因为开始提交到案遇到负的临界值的情况),如果新来的数大于first则 second first依次后移并且把这歌新值赋值给first [正确代码] 1 class Solution { 2 public int thirdMax(int[] nums) { 3 long first = nums[0], second = Long.MIN_VALUE, third = Long.