男朋友被裁員了,該怎麽安慰他?一位35歲+程式設計師女朋友線上尋求方法
她表示自己男朋友35+程式設計師被裁,不知道以後要幹嘛,很迷茫….以前只是看裁員的貼文,這一次真的輪到自己,才發現這種感受是形容不來的…..哎,還想著能狗到40歲,沒想到這麽快…..
其實35被裁已經不是什麽新鮮事情了,雖然知道這樣不對,但是作為社畜的我們也無力改變。
怎麽說呢,就真的挺難的,網友表示35歲了後面也不知道幹嘛,考公也考不了, 互聯網真的沒法養老 不該抱有幻想
還有網友表示,35歲+的女生更難,起碼男生還是有機會的,但是女生是幾乎沒有
為了緩解小姐姐的憂慮,不少網友紛紛起哄,不如直接換個男朋友吧,焦慮秒沒
最後還是那句話, 繼續找工作唄,還能幹嘛。工作難找也還是得找啊
下面是今日的大廠演算法題
今日演算法題
,來自LeetCode的第23題:合並 K 個升序連結串列,下面是我的演算法思路及實作,讓我們來看看吧。
# 演算法題目
給你一個連結串列陣列,每個連結串列都已經按升序排列。
請你將所有連結串列合並到一個升序連結串列中,返回合並後的連結串列。
# 演算法思路
1.分治法:
將K個連結串列分成兩部份,先分別處理這兩部份,然後將兩個部份的結果合並。這一過程遞迴進行,直到問題規模縮小到可以直接解決。
2.合並兩個有序連結串列:
在分治的過程中,我們需要一個輔助函式來合並兩個有序連結串列。這個函式從兩個連結串列的頭節點開始,比較它們的值,選擇較小的節點加入到結果連結串列中,然後移動指標繼續比較,直至所有節點都被合並。
3.遞迴合並:
不斷將連結串列對分成更小的子集,直到每個子集只有一個連結串列或沒有連結串列。然後開始合並這些連結串列,最終得到單個排序連結串列。
# 程式碼實作
C語言實作
由於C語言程式碼的實作相對較長,這裏提供一個概述思路和關鍵函式的虛擬碼:
//定義連結串列結構體`struct ListNode`
structListNode {
int val;
structListNode *next;
};
//實作`mergeTwoLists(struct ListNode* a, struct ListNode* b)`函式合並兩個有序連結串列
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
structListNodepreHead;
structListNode *p = &preHead;
preHead.next = NULL;
while (l1 != NULL && l2 != NULL) {
if (l1->val < l2->val) {
p->next = l1;
l1 = l1->next;
} else {
p->next = l2;
l2 = l2->next;
}
p = p->next;
}
if (l1 != NULL) {
p->next = l1;
} else {
p->next = l2;
}
return preHead.next;
}
//使用分治法`mergeKLists(struct ListNode** lists, int listsSize)`,遞迴地將連結串列陣列分成更小的部份,使用`mergeTwoLists`函式合並
struct ListNode* merge(struct ListNode** lists, int left, int right){
if (left == right) {
return lists[left];
}
if (left > right) {
returnNULL;
}
int mid = left + (right - left) / 2;
structListNode* l1 = merge(lists, left, mid);
structListNode* l2 = merge(lists, mid + 1, right);
return mergeTwoLists(l1, l2);
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize){
return merge(lists, 0, listsSize - 1);
}
Java實作
classListNode{
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
}
public classSolution{
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length == 0) returnnull;
return merge(lists, 0, lists.length - 1);
}
private ListNode merge(ListNode[] lists, int left, int right) {
if (left == right) return lists[left];
int mid = left + (right - left) / 2;
ListNode l1 = merge(lists, left, mid);
ListNode l2 = merge(lists, mid + 1, right);
return mergeTwoLists(l1, l2);
}
private ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
}
Python實作
classListNode:
def__init__(self, val=0, next=None):
self.val = val
self.next = next
defmergeKLists(lists):
ifnot lists or len(lists) == 0:
returnNone
defmergeTwoLists(l1, l2):
ifnot l1:
return l2
ifnot l2:
return l1
if l1.val < l2.val:
l1.next = mergeTwoLists(l1.next, l2)
return l1
else:
l2.next = mergeTwoLists(l1, l2.next)
return l2
defmerge(lists, left, right):
if left == right:
return lists[left]
mid = left + (right - left) // 2
l1 = merge(lists, left, mid)
l2 = merge(lists, mid + 1, right)
return mergeTwoLists(l1, l2)
return merge(lists, 0, len(lists) - 1)
# 演算法解析
分治法在解決這類問題時極為有效,它透過遞迴地將問題分解為更小的子問題來降低問題的復雜度,然後再合並結果。
這種方法的時間復雜度為O(N log K),其中N是所有連結串列中元素的總和,K是連結串列個數。這是因為每次叠代中元素的比較次數總共為N,而分治的深度為log K。
# 範例和測試
假設我們有K=3個連結串列[1->4->5, 1->3->4, 2->6],使用上述Python程式碼進行合並,結果應該是一個新的有序連結串列1->1->2->3->4->4->5->6。
# 總結
合並K個升序連結串列是一個典型的分治法套用案例,透過將問題分解為可管理的小部份,再逐步合並結果,我們可以高效地解決這個問題。不同程式語言的實作雖有差異,但演算法的核心思想是一致的
熱門推薦