4 力扣2023年常見程式設計題總結 堆 棧和佇列

2021-09-24 13:43:30 字數 3502 閱讀 4000

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 解釋 合併陣列...