楼主: Reborn2beCoder
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] June LeetCoding Challenge

🔗
megrez 2020-6-5 12:24:03 | 只看该作者
全局:
前两个月的challenge都是差一两天就全勤了,六月再努力一把吧(可是LC这奖品也太不吸引人了)

评分

参与人数 1大米 +1 收起 理由
Reborn2beCoder + 1 一起加油!

查看全部评分

回复

使用道具 举报

🔗
 楼主| Reborn2beCoder 2020-6-5 12:28:02 | 只看该作者
全局:
megrez 发表于 2020-6-4 20:24
前两个月的challenge都是差一两天就全勤了,六月再努力一把吧(可是LC这奖品也太不吸引人了)

lz前俩月都是一开始刷的很勤快,一般刚过12点就会把第二天的刷掉,然后月中某天一旦开始掉链子就放弃治疗了😂
回复

使用道具 举报

全局:
本帖最后由 鸡籽就是大王 于 2020-6-5 23:26 编辑

Random Pick with Weight

这题目的input output是什么意思...不明白为什么专门选这种奇怪的题目 600+赞 1600踩
=======================================
我好像看懂了,solution是初始化,然后后面几个pickindex就是sample了几次;
第二行第一个就是weight vector,后面的都不用管
output和第一行对应,第一个对应初始化不用管,后面的是每次sample出来的数字(被sample的数字应该就是index)

评分

参与人数 1大米 +1 收起 理由
Reborn2beCoder + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
 楼主| Reborn2beCoder 2020-6-6 14:03:19 | 只看该作者
全局:
鸡籽就是大王 发表于 2020-6-5 07:10
Random Pick with Weight

这题目的input output是什么意思...不明白为什么专门选这种奇怪的题目 600+赞  ...

题目真的写得很不清楚,看懂了input output,但是想了半天没明白啥叫` in proportion to its weight`。神奇的是在解析里面看完一大段废话之后第一句就秒懂了,真的无语

btw现在已经2000+ down votes了🙃
回复

使用道具 举报

全局:
Reborn2beCoder 发表于 2020/06/06 14:03:19
题目真的写得很不清楚,看懂了input output,但是想了半天没明白啥叫` in proportion to its...
我也down vote了,相当沙币的一道题

评分

参与人数 1大米 +1 收起 理由
Reborn2beCoder + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
 楼主| Reborn2beCoder 2020-6-6 14:54:29 | 只看该作者
全局:
6/5 https://leetcode.com/problems/random-pick-with-weight/
跟楼上的几位同学一样,花了些工夫理解题目究竟想问啥。最后使用了二分搜索,值得注意的是这里如果`this.weights[m] === r`的情况下,应该返回的是m+1而不是m,因为第一个Index对应的区间应该是[0, this.weights[0]),注意右边是开区间,然后以此类推。lz因为这个原因在第54个test case卡了好久(差点错过ddl),手动测试了前100次
pickIndex也都能通过,一度以为test case有bug。最后想通了发现也是make sense,感叹一下leetcode的test还是非常严苛的。

  1. /**
  2. * @param {number[]} w
  3. */
  4. var Solution = function(w) {
  5.     this.weights = [], sum = 0;
  6.     for(let i=0; i<w.length; i++) {
  7.         sum += w[i];
  8.         this.weights[i] = sum;
  9.     }
  10.     this.total = sum;
  11. };

  12. /**
  13. * [url=home.php?mod=space&uid=160137]@return[/url] {number}
  14. */
  15. Solution.prototype.pickIndex = function() {
  16.     const r = parseInt(Math.random() * this.total);
  17.     let s = 0, e = this.weights.length-1;
  18.     while(s<e) {
  19.         const m = parseInt((s+e)/2);
  20.         if(this.weights[m] > r) e = m;
  21.         else s = m + 1
  22.     }
  23.     return s;
  24. };
复制代码
回复

使用道具 举报

🔗
 楼主| Reborn2beCoder 2020-6-7 12:03:52 | 只看该作者
全局:
6/6 星期六 (非常6的一个日子)https://leetcode.com/problems/queue-reconstruction-by-height/

感觉题目还是有点tricky的,一开始不看hint完全没思路,看完之后先是写出了如下解法:
  1. vvar reconstructQueue = function(people) {
  2.     if(!people || people.length < 2) return people;
  3.     people.sort((a, b) => a[0] === b[0] ? b[1] - a[1] : a[0] - b[0]);
  4.     let remaining = [...Array(people.length).keys()], res = new Array(people.length);
  5.     while(people.length) {
  6.         let ppl = people.shift();
  7.         let idx = remaining[ppl[1]];
  8.         remaining.splice(ppl[1], 1);
  9.         res[idx] = ppl;
  10.     }
  11.     return res;
复制代码


再看答案的时候才发现hint似乎具有误导性,因为如果从shortest开始排的话就需要类似如上remaining的一个array来记录已经填充的位置,而如果从tallest开始的话则会更简单,这里的关键是 `The smaller persons are "invisible" for the taller ones`(哎,矮个子的忧桑):
  1. var reconstructQueue = function(people) {
  2.     if(!people || people.length < 2) return people;
  3.     people.sort((a, b) => a[0] === b[0] ? a[1] - b[1] : b[0] - a[0]);
  4.     const res = [];
  5.     people.forEach(ppl => {
  6.         res.splice(ppl[1], 0, ppl);
  7.     })
  8.     return res;
  9. };
复制代码


最后的空间复杂度为O(n),时间复杂度则取决于JS当中Array.splice()的实现,如果使用Linkedlist的话应当为O(1),则整个算法的复杂度为O(nlogn + n) = O(nlogn); 但如果使用普通数组实现的话splice为O(n),最后的时间复杂度变成O(nlogn + n^2) = O(n^2)

评分

参与人数 1大米 +1 收起 理由
zyshmie + 1 赞一个

查看全部评分

回复

使用道具 举报

🔗
 楼主| Reborn2beCoder 2020-6-8 14:11:34 | 只看该作者
全局:
本帖最后由 Reborn2beCoder 于 2020-6-7 22:14 编辑

6/7 https://leetcode.com/problems/coin-change-2/ 第一周的最后一天,大家加油呀~~~!
lz先写了coin change再来做这个,结果思路受到了误导,一开始写了个backtrack(因为按照I的思路只用DP已经无法解决了),结果amount太大的时候会超时。后来无奈偷偷查看了答案,发现这两题的本质区别在于,虽然同是动态规划,但是如果以amount序列为横坐标的话,I的纵坐标为coin count,而II的纵坐标为combinations(一定要看清问题当中的落脚点在哪里),而且要把各种coin一层一层依次叠加上去,这里因为需要去重,并不适合I当中一开始就各种coin大乱炖的解法。

  1. var change = function(amount, coins) {
  2.     let count = Array(amount+1).fill(0);
  3.     count[0] = 1;
  4.     coins.forEach(coin => {
  5.         for(let i=coin; i<amount+1; i++) {
  6.             count[i] += count[i-coin];
  7.         }
  8.     })
  9.     return count[amount];
  10. };
复制代码


T: O(amount * coins.length)
S: O(amount)
由衷的感慨一下DP真的太强大了,可以用如此精简的代码解决这么复杂的问题,希望有朝一日可以充分掌握它,写题的时候不用再偷偷看答案 😅[/i]

评分

参与人数 1大米 +1 收起 理由
zyshmie + 1 赞一个

查看全部评分

回复

使用道具 举报

🔗
 楼主| Reborn2beCoder 2020-6-9 12:54:42 | 只看该作者
全局:
6/8 https://leetcode.com/problems/power-of-two/
周一例行Easy
1) recursion O(logn)
  1. var isPowerOfTwo = function(n) {
  2.     if(n <= 0) return false;
  3.     if(n <= 2) return true;
  4.     if(n % 2) return false;
  5.     return isPowerOfTwo(n/2);
  6. };
复制代码


2) Iteration O(logn)
  1. var isPowerOfTwo = function(n) {
  2.     if(n <= 0) return false;
  3.     while(n%2 === 0) {
  4.         n = n/2;
  5.     }
  6.     return n === 1;
  7. };
复制代码


3) Bit manipulation O(1)
  1. var isPowerOfTwo = function(n) {
  2.     return n>0 && (n & (n-1)) == 0;
  3. };
复制代码


不知道是不是所有的算法都很快的缘故,感觉Runtime Distribution很不make sense...
回复

使用道具 举报

🔗
 楼主| Reborn2beCoder 2020-6-10 13:55:16 | 只看该作者
全局:
6/9 https://leetcode.com/problems/is-subsequence/
双指针经典题目
  1. var isSubsequence = function(s, t) {
  2.     if(s.length > t.length) return false;
  3.     let i = j = 0;
  4.     while(i<s.length && j<t.length) {
  5.         if(s[i] === t[j]) i++;
  6.         j++;
  7.     }
  8.     return i === s.length;
  9. };
复制代码


T: O(t.length)
S: O(1)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表