Cool说丨力扣414与581

简介: 414. 第三大的数581. 最短无序连续子数组

414. 第三大的数   很不错的题目

给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。

示例 1:

输入: [3, 2, 1]

输出: 1

解释: 第三大的数是 1.

示例 2:

输入: [1, 2]

输出: 2

解释: 第三大的数不存在, 所以返回最大的数 2 .

示例 3:

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

输出: 1

解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。

存在两个值为2的数,它们都排第二。

第一版,有参考

执行用时 :4 ms, 在所有 cpp 提交中击败了99.23%的用户

内存消耗 :9.1 MB, 在所有 cpp 提交中击败了67.43%的用户

intthirdMax(vector<int>&nums) {

   longlong  firstNum=LONG_MIN,secondNum=LONG_MIN,thirdNum=LONG_MIN;

   for (auto&a : nums) {

       if (firstNum<a) {

           

           thirdNum=secondNum;

           secondNum=firstNum;

           firstNum=a;

       }

       elseif (firstNum>a&&secondNum<a) {

           thirdNum=secondNum;

           secondNum=a;

       }

       if (secondNum>a&&thirdNum<a ) {

           thirdNum=a;

       }

   }

   if (thirdNum==LONG_MIN)

       returnfirstNum;

   else

       returnthirdNum;

       

   }

581. 最短无序连续子数组  很经典的题目,very nice

给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

你找到的子数组应是最短的,请输出它的长度。

示例 1:

输入: [2, 6, 4, 8, 10, 9, 15]

输出: 5

解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。

说明 :

  1. 输入的数组长度范围在 [1, 10,000]。
  2. 输入的数组可能包含重复元素 ,所以升序的意思是<=。

第一版,参考别人的思路

从左到右循环,记录最大值为 max,若 nums[i] < max, 则表明位置 i 需要调整,记录需要调整的最大位置 i 为 low; 同理,从右到左循环,记录最小值为 min, 若 nums[i] > min, 则表明位置 i 需要调整,记录需要调整的最小位置 i 为 high.

其实并不是的,而是从左向右,保存该过程中的最大值,当当前值与MAX进行对比,如果小于的话说明已经到达了无序列表中了,那就记录当前值,一直到有序列表为止,此时后半部分的有序列表中的第一个值,也要比前面的大或等于前面的最大值,记录下的位置值就不会再改动了,从右到左的部分类似

执行用时 :24 ms, 在所有 cpp 提交中击败了99.68%的用户

内存消耗 :10.5 MB, 在所有  cpp 提交中击败了85.61%的用户

intfindUnsortedSubarray(vector<int>&nums) {

   if (nums.size() <=1) return0;

   intlen=nums.size(),low=0, high=len-1, maxNum=nums[0], minNum=nums[len-1];

   for (inti=1; i<len; i++) {

       maxNum=max(maxNum, nums[i]);

       minNum=min(minNum, nums[len-1-i]);

       if (nums[i] <maxNum) low=i;

       if (nums[len-1-i] >minNum) high=len-1-i;

   }

   returnlow>high?low-high+1 : 0;

}

第二版,获得启发,重新写了一遍

执行用时 :44 ms, 在所有 cpp 提交中击败了70.21%的用户

内存消耗 :10.4 MB, 在所有 cpp 提交中击败了94.96%的用户

if (nums.size() ==1) return0;

   intlow=0, high=nums.size() -1,len=nums.size();

   intmaxNum=nums[0], minNum=nums[high];

   

   for (inti=1; i<len ; ++i) {

       maxNum=max(nums[i], maxNum);

       if (nums[i] <maxNum) {    

           low=i;

           //cout << low <<endl;          

       }

}

   for (intj=high-1; j>=0 ; --j) {

       minNum=min(nums[j], minNum);

       if (nums[j] >minNum) {

           high=j ;

           //cout <<"high "<< high << endl;

       }

   }

   //cout << low << " " << high << endl;

   if (low>high)

       returnlow-high+1;

   else

       return0;

第三版,将两个循环改为单一循环,加速了一下

执行用时 :28 ms, 在所有 cpp 提交中击败了98.19%的用户

内存消耗 :10.3 MB, 在所有 cpp 提交中击败了97.12%的用户

intfindUnsortedSubarray(vector<int>&nums) {

   if (nums.size() ==1) return0;

   intlow=0, high=nums.size() -1,len=nums.size();

   intmaxNum=nums[0], minNum=nums[high];

   

   for (inti=1; i<len ; ++i) {

       maxNum=max(nums[i], maxNum);

       if (nums[i] <maxNum) {    

           low=i;        

       }

       minNum=min(nums[len-1-i], minNum);

       if (nums[len-1-i] >minNum) {

           high=len-1-i;

       }

}

   returnlow>high?low-high+1 : 0;

       

   }


目录
相关文章
|
人工智能 C# C++
Cool说丨力扣153、454
153. 寻找旋转排序数组中的最小值 454. 四数相加 II
125 1
|
C# C++
Cool说丨力扣287/792/378
关注博主,获取更多知识
98 0
|
C# C++ 索引
Cool说丨力扣162
162. 寻找峰值
87 0
|
存储 C# C++
Cool说丨力扣29/34
关注博主。获取更多知识
100 0
|
存储 C# C++
Cool说丨力扣392
392. 判断子序列
68 0
|
C# C++
Cool说丨力扣744、704
744. 寻找比目标字母大的最小字母 704. 二分查找
99 0
|
C#
Cool说丨力扣475
475. 供暖器
109 0
|
机器学习/深度学习 算法 C#
Cool说丨力扣202
202. 快乐数
96 0
|
C#
Cool说丨力扣167
167. 两数之和 II - 输入有序数组
66 0
|
C# C++
Cool说丨力扣374、441
441. 排列硬币 374. 猜数字大小
82 0