演算法題Day6 第三大的數

2021-09-26 13:00:09 字數 1728 閱讀 7658

給定乙個非空陣列,返回此陣列中第三大的數。如果不存在,則返回陣列中最大的數。要求演算法時間複雜度必須是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 輸出 ...