1.設計乙個支援 push,pop,top 操作,並能在常數時間內檢索到最小元素的棧。
解:前四個操作均可以使用stack來完成,檢索最小元素,需要重新用乙個新的stack來儲存每次壓入元素的最小值。
**:
using namespace std;
class minstack
void push(int x)
} void pop()
s.pop();
} int top()
int getmin()
private:
stacks;
stacks_min;
};int main()
2.在未排序的陣列中找到第k個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。
解:找出第k個最大的資料,即先用降序進行排序再輸出。
**:
using namespace std;
class solution
};int main()
; solution s1;
cout << s1.findkthlargest(a,4) << endl;
return 1;
}
3.中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。
例如,[2,3,4] 的中位數是 3
[2,3] 的中位數是 (2 + 3) / 2 = 2.5
設計乙個支援以下兩種操作的資料結構:
void addnum(int num) - 從資料流中新增乙個整數到資料結構中。
double findmedian() - 返回目前所有元素的中位數。
**:
class medianfinder
void addnum(int num)
int diff = min_heap.size() - max_heap.size();
if (abs(diff) > 1)
else
} }double findmedian()
private:
priority_queue, greater> max_heap;//優先佇列,最大值在隊首
priority_queue, less> min_heap;//建立優先佇列,最小值在隊首
};int main()
; medianfinder s1;
s1.addnum(1);
s1.addnum(2);
cout << s1.findmedian()<< endl;
return 1;
}
4.給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第k小的元素。
請注意,它是排序後的第k小元素,而不是第k個元素。
示例:matrix = [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15] ], k = 8, 返回 13。
解:因為要輸出第k個大的元素,可以考慮用優先對列來完成,即每插入乙個元素就進行依次排序。
**:
class solution
}} return q.top();
}};int main()
,, };
std::cout << s1.kthsmallest(p,4);
}
5.給定乙個非空的整數陣列,返回其**現頻率前k高的元素。
示例 1:輸入:nums = [1,1,1,2,2,3], k = 2輸出:[1,2]
解:利用map儲存每個次出現的次數。在將其放入vector中進行排序,在取出前面k個
**:
class solution
sort(record2.begin(), record2.end());
for (int i = record2.size()-1; i >=0&&k>0; i--,k--)
return result;
}};int main()
; std::cout << s1.topkfrequent(p,4)[0];
}
6.給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗 k 內的數字。滑動視窗每次只向右移動一位。返回滑動視窗最大值。
示例:輸入:nums =[1,3,-1,-3,5,3,6,7]
, 和 k = 3輸出:[3,3,5,5,6,7]
解:通過利用雙端序列來進行索引的增加與刪除
**:
class solution
return res;
}};int main()
; std::cout << s1.maxslidingwindow(p,3)[0];
}
7.實現乙個基本的計算器來計算乙個簡單的字串表示式的值。字串表示式僅包含非負整數,+
,-
,*
,/
四種運算子和空格 。 整數除法僅保留整數部分。
解:從字串中取出數字與運算符號,一旦遇到運算子則將數字要入棧中。
**:
class solution
if ((s[i] != ' ' && (s[i] <'0' || s[i]>'9')) || i == (s.length() - 1))
else if (sign == '-')
else if (sign == '*')
else if (sign == '/')
sign = s[i];
value = 0;
}} int res = 0;
while (!tmp.empty())
return res;
}};int main()
; std::cout << s1.calculate("2+3*3");
}
8.根據逆波蘭表示法,求表示式的值。有效的運算子包括+
,-
,*
,/
。每個運算物件可以是整數,也可以是另乙個逆波蘭表示式。
解:如果當前字元為變數或者為數字,則壓棧,如果是運算子,則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表示式掃瞄完後,棧裡的就是結果。
**:
class solution
} return s.top();//返回棧頂元素
}};int main()
; std::cout << s1.evalrpn(p);
}
5 力扣2023年常見程式設計題總結 鍊錶
1.給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。要求返回這個鍊錶的深拷貝。解 為了實現在o n 的時間複雜度內完成操作,可以先複製每乙個結點到其後面,在複製其random指標,最後進行拆分 1.複製每乙個結點,並接在原始結點的後面 2.根據原始結點複製r...
力扣程式設計題
1.給定乙個整數陣列 nums 和乙個整數目標值 target,在該陣列中找出 和為目標值 的那 兩個 整數,並返回它們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。你可以按任意順序返回答案。列舉陣列中的每乙個數 x,尋找陣列中是否存在 target x。2.數...
刷題 力扣 4
題目鏈結 題目描述 給定兩個大小為 m 和 n 的正序 從小到大 陣列 nums1 和 nums2。請你找出並返回這兩個正序陣列的中位數。高階 你能設計乙個時間複雜度為 o log m n 的演算法解決此問題嗎?示例 1 輸入 nums1 1,3 nums2 2 輸出 2.00000 解釋 合併陣列...