給定乙個非空陣列,返回此陣列中第三大的數。如果不存在,則返回陣列中最大的數。要求演算法時間複雜度必須是o(n)。
示例 1:
輸入: [3, 2, 1]
輸出: 1
解釋: 第三大的數是 1.
示例 2:
輸入: [1, 2]
輸出: 2
解釋: 第三大的數不存在, 所以返回最大的數 2 .
示例 3:
輸入: [2, 2, 3, 1]
輸出: 1
解釋: 注意,要求返回第三大的數,是指第三大且唯一出現的數。
存在兩個值為2的數,它們都排第二。
最初思路
遍歷陣列,先降序排序、初始化第乙個為預設的比較參照值。
設定flag為0
每一次都和後面乙個去比較,如果後面比參照值小,flag++
參照值也後移
當flag===3時,跳出迴圈
在最前面進行特殊判斷,如果陣列不足3位,直接return最大值
如果剛好三位、且三位不重複、則返回第乙個(最大元素)
但是這樣的話、沒有考慮到flag一直小於3的情況
最初思路**
function
thirdmax
(nums));
if(nums.length <3)
else
if(nums.length===3)
else
}else
tempvalue = nums[i +1]
;//移動tempvaule的值
if(flag ===3)
}//for
return nums[0]
;//如果一直沒找到就返回最大的
}}
後來思路
於是我想,我能不能把重複的那些值都變成0.只留乙個,最後刪除陣列中為0的元素。然鵝我卡住的點是,不知道怎麼刪除。。當時也很煩也就沒繼續想下去。但是我知道這個方法改進一下是可行的
最後思路
使用indexof()函式、找到每乙個元素在陣列中第一次出現的位置
如果有重複的值,那麼他的indexof函式的返回值就不是本身自己的下標
所以把最後返回值為本身索引的值放進乙個新的陣列中去
最後這個新的陣列的元素,就是原陣列中去掉重複元素之後的樣子
依舊是有序的陣列,降序
題目說要返回第三大的數字,那我直接返回新陣列下標為2的值
但是在這裡編譯的時候,還有乙個問題沒有考慮到,萬一新陣列中的元素個數少於3呢?
所以我在最後的時候加上了乙個判斷:如果長度<3直接返回第乙個(因為第乙個值是最大的)如果大於3或者等於3 直接返回第三個元素
最後思路**
function
thirdmax
(nums));
//降序排序函式
if(nums.length<3)
else
if(newarr.length<3)
else
}}
最後:總的來說思路就是:去掉重複的,返回第三個
但其實這樣是有點沒有符合題目要求的
題目要求時間複雜度為o(n)
但是我這…emmmm之後再更新有效的演算法……
第三大的數
第三大的數 給定乙個非空陣列,返回此陣列中第三大的數。如果不存在,則返回陣列中最大的數。要求演算法時間複雜度必須是o n 示例 1 輸入 3,2,1 輸出 1解釋 第三大的數是 1.示例 2 輸入 1,2 輸出 2解釋 第三大的數不存在,所以返回最大的數 2 示例 3 輸入 2,2,3,1 輸出 1...
第三大的數
給定乙個非空陣列,返回此陣列中第三大的數。如果不存在,則返回陣列中最大的數。要求演算法時間複雜度必須是o n 示例 1 輸入 3,2,1 輸出 1 解釋 第三大的數是 1.示例 2 輸入 1,2 輸出 2 解釋 第三大的數不存在,所以返回最大的數 2 示例 3 輸入 2,2,3,1 輸出 1 解釋 ...
414 第三大的數(簡單題)
題目描述 給定乙個非空陣列,返回此陣列中第三大的數。如果不存在,則返回陣列中最大的數。要求演算法時間複雜度必須是o n 示例 1 輸入 3,2,1 輸出 1 解釋 第三大的數是 1.示例 2 輸入 1,2 輸出 2 解釋 第三大的數不存在,所以返回最大的數 2 示例 3 輸入 2,2,3,1 輸出 ...