以前我一直以為程式設計師35歲之後就不太好找工作了,昨天我在瀏覽招聘軟體的時候無意間發現,有不少企業在招聘要求上直接寫上不能超過30歲,看到這種奇葩要求有時候真的想罵人。。。
有一家上市公司竟然也這樣寫,不過他要求的是初級,這個勉強能接受。還有招聘高級的也要求30歲以下,真的是無語了,誰給它的勇氣。
--------------下面是今天的演算法題--------------
來看下今天的演算法題,這題是LeetCode的第503題:下一個更大元素 II。
問題描述
來源:LeetCode第503題
難度:中等
給定一個迴圈陣列 nums(nums[nums.length - 1] 的下一個元素是 nums[0]),返回 nums 中每個元素的下一個更大元素 。
數位 x 的 下一個更大的元素 是按陣列遍歷順序,這個數位之後的第一個比它更大的數,這意味著你應該迴圈地搜尋它的下一個更大的數。如果不存在,則輸出 -1 。
範例1:
輸入 : nums = [1,2,1]
輸出 : [2,-1,2]
解釋 : 第一個 1 的下一個更大的數是 2;
數位 2 找不到下一個更大的數;
第二個 1 的下一個最大的數需要迴圈搜尋,結果也是 2。
範例2:
輸入 : nums = [1,2,3,4,3]
輸出 : [2,3,4,-1,4]
1 <= nums.length <= 10^4
-10^9 <= nums[i] <= 10^9
問題分析
這題和前幾天講的 類似,只不過這題是個迴圈陣列,我們對陣列 遍歷兩邊 即可,超出陣列長度之後,要對陣列長度取余。
JAVA:
publicint[] nextGreaterElements(int[] nums) {
int length = nums.length;
int ans[] = newint[length];
Arrays.fill(ans, -1);// 預設都為-1
Stack<Integer> stk = new Stack<>();
// 相當於把陣列迴圈兩遍
for (int i = 0; i < length * 2; i++) {
int index = i % length;
// 單調棧,儲存的是元素的下標,不是元素的值,從棧頂
// 到棧底所對應的值是遞增的。
while (!stk.isEmpty() && nums[stk.peek()] < nums[index])
ans[stk.pop()] = nums[index];
// 當前元素的下標入棧
stk.push(index);
}
return ans;
}
C++:
public:
vector<int> nextGreaterElements(vector<int> &nums){
int length = nums.size();
vector<int> ans(length, -1); // 預設都為-1
stack<int> stk;
// 相當於把陣列迴圈兩遍
for (int i = 0; i < length * 2; i++) {
int index = i % length;
// 單調棧,儲存的是元素的下標,不是元素的值,從棧頂
// 到棧底所對應的值是遞增的。
while (!stk.empty() && nums[stk.top()] < nums[index]) {
ans[stk.top()] = nums[index];
stk.pop();
}
// 當前元素的下標入棧
stk.push(index);
}
return ans;
}
Python:
defnextGreaterElements(self, nums: List[int]) -> List[int]:
length = len(nums)
ans = [-1] * length # 預設都為-1
stk = []
# 相當於把陣列迴圈兩遍
for i in range(length * 2):
index = i % length
while stk and nums[stk[-1]] < nums[index]:
ans[stk.pop()] = nums[index]
stk.append(index)
return ans