Leetcode 每日一题和每日一题的下一题刷题笔记 4/30
写在前面
这是我参与更文挑战的第4天,活动详情查看:更文挑战
快要毕业了,才发现自己被面试里的算法题吊起来锤。没办法只能以零基础的身份和同窗们共同加入了力扣刷题大军。我的同学们都非常厉害,他们平时只是谦虚,口头上说着自己不会,而我是真的不会。。。乘掘金鼓励新人每天写博客,我也凑个热闹,记录一下每天刷的前两道题,这两道题我精做。我打算每天刷五道题,其他的题目嘛,也只能强行背套路了,就不发在博客里了。
本人真的只是一个菜鸡,解题思路什么的就不要从我这里参考了,编码习惯也需要改进,各位如果想找刷题高手请教问题我觉得去找 宫水三叶的刷题日记 这位大佬比较好。我在把题目做出来之前尽量不去看题解,以免和大佬的内容撞车。
另外我也希望有得闲的大佬提供一些更高明的解题思路给我,欢迎讨论哈!
好了废话不多说开始第四天的前两道题吧!
2021.6.4 每日一题
这个题说实在的第一遍题面没看懂。。。你输入里面不是把答案都告诉我了嘛。后来才反应过来真正能拿得到的输入是代码区里面的函数形参位置上面填入的实参。
不瞎白活了,这题感觉和前面哈希表那些要用到的东西一样,也是用一个可能会重复的东西放到不能重复的键上,然后看前面有没有和现在这个重复的。这道题应该用不到键值对这样的,因为本身链表元素你给个位置它是有地址的,这样不需要存一对一对的数据,直接用哈希集合。然后看链表相交的地方,首先要把任意一条链表里的元素都存到哈希集合里面,这样等会一有重复一下就看到了。
撸个码,简单写完就通过了,这题好像没用到前缀和。。。刚刻进DNA你叫我把这段基因给敲掉???
写完和官方题解方法一一样,那就不贴代码了。
然后看到了双指针解法,就是某位大佬的走到尽头见不到你,于是走过你来时的路,等到相遇时才发现,你也走过我来时的路解法。
简单画个图,好解释原理:
-1-2-3-4-5-6-7-8-9-0-1-2-3-4-5-6-7-8-9-0-
pointer 1: 4 1 8 4 5|5 6 1 8 4 5
^
pointer 2: 5 6 1 8 4 5|4 1 8 4 5
^
如图,两个指针都要把两个链表里的元素遍历一遍,当两个指针的位置重合的时候,返回指向的那个位置,那个位置还在两个链表里面,这两个链表有重合,在链表外面,两个链表没有重合。注意,两个链表本身要有长度的,如果链表里面本身都没有元素,那不用双指针就知道不可能重合了。
这个解法我也是新学到的,代码不是我原创,各位去看官方题解方法二。
2021.6.4 每日一题下面的题
摸奖时间到!这次是:
这个题很有意思啊,像小时候那些奥数班里面会出的题目。因为两个人都会给一颗石头评分,一颗石头被某一方选中,带来的结果是自己这边增加自己估的价值,对面减少对面估的价值。然后每一方都要保证自己这一颗石头是当前取到的最好的石头,评价方法就是拿选取这颗石头之后自己和对面的得分相减,这个差值越大,这颗石头选的越好。总得分相减其实就是把两边估的价值相加,可以自己捣鼓捣鼓算式。前面说到的“确保当前这颗石头是现在所有选择里面最好的选择”这种局部最优,一看就是贪心没跑了。所以代码写出来也不难理解,先把两边估出来的价值对应相加,然后排序,每次两人都按照总价值最大的那颗石头取。因为是爱丽丝先取,这是天生先手,所以只能在总价值降序排序之后的序列里面从前往后依次取单数编号的石头,鲍勃后取,只能在总价值降序排序之后的序列里面从前往后依次取双数编号的石头。这么看来两个人取石头都是有规律的,只要把总价值降序排序之后的序列里面单数编号和偶数编号的元素取出,分别求和(不要拿总价值那里直接求和,那样是不对的)就能得到取完石头两人手里石头的价值,这个值一比就出结果了。
前面说的总价值降序排序那个数组,不能在最后计算得分的时候使用,因为当某个石头没被选取的时候,这个总价值才对决策有参考意义,一旦被选取上,这颗石头的价值就已经被确定了,不是那个用于决策的价值了。(这里有点信息论的思想,当一段信息的不确定性被消除了,那这个信息的价值会有所下降,生活中的例子很多,比如说一场球赛没打完之前人们都去关心比分,而打完之后除了复盘的人更关注比分,其他的人就都去看得分集锦去了)
写代码
class Solution {
public:
int stoneGameVI(vector<int>& aliceValues, vector<int>& bobValues) {
vector<pair<int, int>> alice_bob_values;
int n = aliceValues.size();
for(int i = 0; i < n; i++){
int difference = aliceValues[i] + bobValues[i];
alice_bob_values.emplace_back(difference, i);
}
sort(alice_bob_values.rbegin(), alice_bob_values.rend());
int alice_sum = 0, bob_sum = 0;
for(int i = 0; i < n; i++){
if(i % 2 == 0) alice_sum += aliceValues[alice_bob_values[i].second];
else bob_sum += bobValues[alice_bob_values[i].second];
}
if(alice_sum == bob_sum) return 0;
else if(alice_sum > bob_sum) return 1;
else return -1;
}
};
小结
今天没有前缀和,有点失落
参考链接
又是没有参考链接的一天,难道说我变强了?