update leetcode 20230110.md
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
|
||||
给定一个非负整数列表 nums,将它们排列成最大的数并返回。
|
||||
|
||||
```cpp [|4-6|7-9]
|
||||
```cpp [|4-6|7-9|10-11|13]
|
||||
class Solution {
|
||||
public:
|
||||
string largestNumber(vector<int>& nums) {
|
||||
@@ -26,8 +26,6 @@ public:
|
||||
|
||||
Note:
|
||||
|
||||
首先我们要知道对字符串进行大小比较会发生什么事情
|
||||
|
||||
```python
|
||||
'1' + '3' < '2' # True
|
||||
'1' + '3' < '22' # True
|
||||
@@ -35,32 +33,6 @@ Note:
|
||||
'1' + '0' == '10' # True
|
||||
```
|
||||
|
||||
先讲解一下这个代码在干什么
|
||||
|
||||
4-6 先建立一个新的vector,可以理解为可变长度的数组,
|
||||
第五行预先给vector分配和nums数量一样多的内存,因为c++中的vector容器,
|
||||
包括很多其他语言的可变长度数组容器,都是会在数组容量不足的时候自动扩容数组。
|
||||
扩容是怎么扩容个法子呢,简单来说就是新建一个更大容量的数组,
|
||||
然后把原有数组的内容全部复制过去,听起来是不是效率很低?但其实编程语言在背后做了各种优化,
|
||||
比如智能估计数组的容量,提前分配空间,减少扩容次数来提升新能,所以一般来说用户无需太过担心这一部分,
|
||||
但是如果你能够提前知道这个vector会有多长,并且提前给他一次申请够需要的容量,那么肯定是能够提高性能的。
|
||||
第六行是利用的c11的自动类型推断,就是这个auto,编译器可以在编译的时候自动推断出i的类型,这是一个很好用的语法糖。
|
||||
接着是const常量,这是我个人的变成习惯,给不需要修改的变量加上const限制,这么做的好处一个是可以避免
|
||||
不小心修改了这个不该修改的变量导致莫名其妙的bug,另一个是在javascript等动态语言中const可以跳过类型检查
|
||||
稍微提高代码执行速度。
|
||||
i前面的这个符号是c11的左值引用语法,这么写就代表i是nums中的元素,是一个nums中的数字而不是数组下表,
|
||||
在后面可以直接把这个数字转成字符串,然后添加到v列表中,不需要写 nums[i] 这种东西。
|
||||
|
||||
7-9 是对v数组进行排序,这里用了一个自定义函数来比较两个元素的大小。
|
||||
这个自定函数做什么事情呢,他传入两个字符串的引用,然后将字符串拼接起来,看看谁拼在前面会更大。
|
||||
|
||||
10-11 行是定义一个新字符串用于返回最终结果,然后通过一个循环便利我们刚刚排序好的数组v,
|
||||
将数组中每个元素添加到这个字符串里
|
||||
|
||||
12-13 最后我们返回值,注意这里有个边界情况,就是数组中全部都是0,
|
||||
这时候我们用一个三元表达式,如果数组开头第一个元素是0,那么直接返回字符串0,
|
||||
不然的话就正常返回ret变量。
|
||||
|
||||
---
|
||||
|
||||
### 179. Largest Number
|
||||
@@ -97,7 +69,7 @@ Note:
|
||||
|
||||
### 347. Top K Frequent Element
|
||||
|
||||
```cpp [|4-6|]
|
||||
```cpp [|4-6|8-13|15-19|21-28]
|
||||
class Solution {
|
||||
public:
|
||||
vector<int> topKFrequent(vector<int>& nums, int k) {
|
||||
@@ -105,6 +77,9 @@ public:
|
||||
for (auto const &n : nums)
|
||||
count[n]++;
|
||||
|
||||
// 将 map 转为列表
|
||||
// [(0, 5), (1, 3), ... ]
|
||||
// 代表数字 0 出现 5 次,数字 1 出现 3 次
|
||||
vector<pair<int, int>> tmp;
|
||||
for (auto const &pair : count)
|
||||
tmp.push_back(pair);
|
||||
@@ -127,23 +102,46 @@ public:
|
||||
};
|
||||
```
|
||||
|
||||
Note:
|
||||
|
||||
给定一个列表,返回其中出现频率次数最高的 k 个元素。
|
||||
|
||||
4-6 首先我第一个想到要做的事情就是统计各个数字出现的次数对吧。
|
||||
这里创建一个无序哈希表count,然后遍历nums,将对应的值加一.
|
||||
|
||||
---
|
||||
|
||||
### 347. Top K Frequent Element
|
||||
|
||||
Python 版本
|
||||
|
||||
```python []
|
||||
```python [4-5]
|
||||
import collections
|
||||
class Solution:
|
||||
def topKFrequent(self, nums: List[int], k: int) -> List[int]:
|
||||
count = collections.Counter(nums)
|
||||
return [i[0] for i in count.most_common()][:k]
|
||||
count = collections.Counter(nums).most_common(k)
|
||||
return [i[0] for i in count]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 75. Sort Colors
|
||||
|
||||
C++
|
||||
|
||||
```cpp [|2-5|6|7-11|12-14|15-18]
|
||||
void sortColors(vector<int> &nums) {
|
||||
auto low = nums.begin();
|
||||
auto high = nums.end() - 1;
|
||||
|
||||
for (auto mid = nums.begin(); mid <= high;) {
|
||||
switch (*mid) {
|
||||
case 0:
|
||||
swap(*mid, *low);
|
||||
mid++;
|
||||
low++;
|
||||
break;
|
||||
case 1:
|
||||
mid++;
|
||||
break;
|
||||
case 2:
|
||||
swap(*mid, *high);
|
||||
high--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user