414 第三大的數

2021-10-02 08:51:42 字數 1836 閱讀 2664

題目描述:給定乙個非空陣列,返回此陣列中第三大的數。如果不存在,則返回陣列中最大的數。要求演算法時間複雜度必須是o(n)。

示例 1:輸入: [3, 2, 1]           輸出: 1

示例 2:輸入: [1, 2]               輸出: 2   解釋: 第三大的數不存在, 所以返回最大的數 2 .

示例 3:輸入: [2, 2, 3, 1]       輸出: 1        解釋: 注意,要求返回第三大的數,是指第三大且唯一出現的數。存在兩個值為2的數,它們都排第二。

定義三個變數:one ,two ,three,分別用來存放陣列前三個最大的值,那麼一開始應該如何初始化他們呢?

int one = nums[0];

long two = long.min_value,three = two;

也可以將三個數均初始化為 long.min_value,將 two 和 three 定義為 long 型別是因為如果陣列中有 integer.min_value(-2147483648) 這個數,會影響後續的判斷,因此將它設為最小的數。

在這裡不能將三個數全設為 nums[0],假如陣列為 [4,3,2,1],則 one = two = three = 4,那麼後面遍歷陣列時,本來遵守著找比 one,two 或者 three 大的數,但這樣一初始化就找不到了。 

然後遍歷陣列,分別對三個變數進行更新。遍歷陣列的過程中如果當前的數與 one,two 或者 three 相等,那麼就可以跳過此次判斷。 最後對 three 進行判斷,如果它的值沒有改變,那麼表示不存在第三大的數,則返回最大值 one ,否則返回所求數 three。   

public int thirdmax(int nums) 

if(num > one)else if(num > two)else if(num > three)

}return three == long.min_value ? one : (int)three;

}

一、將陣列排序,定義乙個 treeset,往裡面新增數字,由於 set 的 add 方法不會新增重複元素,所以可以保證元素的唯一性,當 set 的元素小於三個就繼續新增,並且記錄新的元素 ret ,直到新增夠 3 個。如果陣列遍歷結束 set 的大小沒有到達 3 個,則表示不存在第三大的數字,那麼返回陣列的最後乙個元素,否則返回 set 最後一次新增的 ret 元素。

public int thirdmax(int nums) 

arrays.sort(nums);

setset = new treeset<>();

int ret = integer.min_value;

for(int i = nums.length-1;i>=0;i--)

}if(set.size()==3)

return nums[nums.length-1];

}

二、treeset 會將新增進去的元素自動排序,那麼

維護乙個只有 3 個元素的 treeset,如果大於三個元素就把 set 中的最小值 remove 掉。

最後如果 set 中元素小於 3 就返回 set 最大值(最後乙個值),否則返回最小值(第乙個)。

public int thirdmax(int nums)

}return set.size() < 3 ? set.last() : set.first();

}

414 第三大的數

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

414 第三大的數

難度 簡單 題目描述 本來這道題不難,但是測試用例好坑,面向測試用例程式設計了好久 解題思路 類似於大根堆的思想,維護乙個長度為3的陣列,陣列裡元素按照從大到小的順序排序。初始是int型最小值,每新增乙個元素,維護陣列裡的元素大小順序。要注意的細節 巨坑 有 重複的元素不能計算,如果不足三個值要返回...