ARST打卡第223周[223/521]

Algorithm

lc23_合并K个升序链表

思考:
感觉有点像大数据处理里面的多文件排序合并。
感觉一开始就把k个链表一起来排序,这样内存会占用很多,而且效率好像不高,因为内存访问比较乱,而且还要对比。(后面看题解,就是这样做,我还是太菜了,没有看出这种方法的可行性。。。)
感觉可能是固定先选一部分链表合并,之后再选一部分链表合并。

没想到考点,感觉盲写会超时或者超内存,看看题解怎么做的。

看题解发现暴力两两合并都没有超时,离谱…

然后优化就是分治的两两合并…

再优化就是用优先队列先存起来,然后再恢复成链表…

感觉完全不符合 hard 这个标签的定义,但凡标一个 medium …

算了,我的问题,想多了,学习一下吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public:
struct Status {
int val;
ListNode *ptr;
// 因为优先队列缺省的是大值优先。所以这里对比取反,就能做到小值优先。
// https://en.cppreference.com/w/cpp/container/priority_queue
bool operator < (const Status &rhs) const {
return val > rhs.val;
}
};

priority_queue <Status> q;

ListNode* mergeKLists(vector<ListNode*>& lists) {
for (auto node: lists) {
if (node) q.push({node->val, node});
}
ListNode head, *tail = &head;
while (!q.empty()) {
auto f = q.top(); q.pop();
tail->next = f.ptr;
tail = tail->next;
if (f.ptr->next) q.push({f.ptr->next->val, f.ptr->next});
}
return head.next;
}
};

Review

【TED演讲】未来的互联网是什么样的

当前的网络世界是把所有的内容自由传播,然后通过广告赚取收益,但是这样创作者的版权收益很小,
很多网站平台偷走了创作者的收益!

所以 NFT 就是为了解决这个问题,通过智能合约,让信息在网络上传播的同时,每次信息交易都能让创作者获得收益。
这样就更好地激发了创作者的创作欲望,而不是让这个创作者再也不想创作了(参考《皮皮鲁外传》《鲁西西外传》《舒克贝塔历险记》作者郑渊洁)

当然道阻且长,且行且珍惜。

Tips

简明 VIM 练级攻略

Share

git mv 移动文件,但是不丢失文件的 commit 信息。

经常在看项目代码时,看到有些代码仓库的某些文件的 commit 信息全是什么文件移动或者是代码结构整理…
这样就导致了原来文件修改的 commit 信息全部丢失,造成后续代码维护时需要消耗更多精力去理解其中的内容。

因此推荐使用 git mv 移动文件,从而保证移动文件,但是不丢失文件的 commit 信息。

同理,推荐添加子项目不丢失commit信息的submodule方法:
NOTICE: 下面内容来自 ChatGPT3.5,博主暂时没全部尝试,不保证一定正确,仅提供一种思路。

在 Git 中,添加子项目并保留原有的提交(commit)信息可以通过使用 Git 的子模块(submodule)功能来实现。子模块允许你在一个 Git 仓库中引用另一个独立的 Git 仓库,并在父仓库中保留子仓库的提交历史和信息。

以下是将子项目添加为子模块的步骤:

  1. 首先,进入你的主项目的根目录,确保你已经在主项目的 Git 仓库下。
  1. 添加子模块:使用以下命令将子项目添加为子模块,其中 URL 是子项目的 Git 仓库地址,path 是你希望子模块在主项目中的存放路径:
1
git submodule add <URL> <path>

例如:

1
git submodule add https://github.com/example/submodule.git submodules/mysubmodule
  1. 提交更改:添加子模块后,你会看到主项目中有一个新的文件(.gitmodules)记录了子模块的信息。将这些更改提交到主项目:
1
2
git add .gitmodules
git commit -m "Add submodule: mysubmodule"
  1. 初始化和更新子模块:第一次添加子模块后,子模块本身是空的,需要初始化和更新才能获取子模块的内容:
1
git submodule update --init --recursive

这会初始化并递归更新所有的子模块。

现在,你的主项目中包含了子模块,并且可以在主项目和子项目之间保留各自的提交历史和信息。

如果你以后需要在子模块中进行修改,并希望这些修改反映在主项目中,可以在子模块中进行修改,然后在主项目中提交更改。同样,如果子模块的远程仓库有新的提交,你可以在主项目中使用以下命令来更新子模块:

1
git submodule update --remote

这会将子模块更新到其远程仓库的最新版本。