上午打完LeetCode第143次周赛,发现很多不常用的知识点都比较生涩了,最后一个半小时也只ac了前两题。这一次的题目相对以往还是比较简单吧,但奈何就是迟迟没有在代码上有较满意的实现。学习果然是不进则退呢。据说把自己的学习过程记录下来会加深印象,说不定还能得到论坛大佬的指点。嗯,大学毕业之际,我要开始在这里记录自己的学习历程。

第一题:糖果分发:

leetcode原题目如下

这题较简单,话不多说先上代码:

public static int[] distributeCandies(int candies, int num_people) {int[] res = new int[num_people];int count = 1;// first person will getint total = 0;// total distributed candiesint i = 0;// index of reswhile (total < candies) {if (i < res.length) {if (total + count <= candies) {// judge whether or not to distributedres[i] += count;// distributetotal += count;// note distributed       } else {// dis retain all of candiesres[i] += candies - total;                break;}i++;count++;} else {i = 0;// reset to beginning of res}}return res;}

解决思路:
根据题目,定义一个自增计数器count用于记录每次分配的糖果,一个分配记录数组res 用于记录每个人所分到的糖果数量,已分配的总糖果数量total 用于作为分配动作终止判断条件,其他若干辅助变量用于提高方案清晰度。经过上一句描述思路已经很清晰了,也就是在终止分配之前对分配数组res进行遍历,结合计数器对res对应下标进行res[i] += count操作即可。需要注意的是在最后一次分配中,也就是在糖果余量不够进行一次或刚好够本次分配的情况下全部分配给对应people,也就是代码res[i] += candies - total;;同时结合判断条件total + count <= candies。同时在分配过程中需要刷新res分配下标:当i在越界之前且还有糖果待分配的情况下将i重置为0。测试结果如下:

第二题:二叉树搜索路径

leetcode原题目如下

拿到这一题的第一想法竟然是去打开vs用c++去构建二叉树(前一秒是java in eclipse),写了半小时后发现可以直接找规律得到查找路径,被自己蠢哭了。
解决思路:
相对于传统的二叉树排布规律,本题在基于树节点层数的奇偶性上进行了小小的堆放改变。这小小的改变对于我这种菜鸟来说还是带来了一些时间上的分析损耗,不过没事问题不大。
先来找找规律:如题所述该树节点序号是从上往下呈现Z字形排布(想起了这题Zigzag,形式相近但关系不大),即在奇数行序号从左往右增大,偶数行从右往左增大,像盘山公路一样。根据二叉树的性质我们可以先计算得到目标节点cur(在后面也称为当前节点序)的层数level,以及该节点在本层上的相对增序(如图节点14的层相对增序为14(cur)-8(beginNCur)=6),在此记当前节点父节点层的结束节点序号为pend(如14的pend为7)、父节点序号为parent(如14的parent为4)。
本题的关键在于父节点序号的求解:结合二叉树性质及上述可知,cur的相对增序curInc/2即为parent的相对增序差值(如14的父节点4的相对增序差值为7-6/2=4=parent),经演算在cur处于奇数节点层的情况下同样满足此规律,故而得到parent的求解运算代码为parent = pend - (cur - beginNCur) / 2;。如此,将上述系列运算置于循环下从目标节点往根节点找parent并进行记录即可完成啦。
代码贴上:

public static List<Integer> pathInZigZagTree(int label) {// last item back trace, reverse it is resultint level = (int) (Math.log(label) / Math.log(2)) + 1;//  floor of curList<Integer> res = new ArrayList<Integer>();res.add(label);//add cur to listint cur = label;int parent;for (int i = level; i >= 2; i--) {int beginNCur = (int) Math.pow(2, i - 1);//beginning order of cur layerint pend = beginNCur - 1;//ending order of parent layerparent = pend - (cur - beginNCur) / 2;cur = parent;res.add(parent);}int i = 0;int j = res.size() - 1;while (i < j) {//reverseint t = res.get(i);res.set(i, res.get(j));res.set(j, t);i++;j--;}return res;}

测试结果如下:

第三题:图书安置

LeetCode原题如下:



咋一看觉得是动态规划问题,又觉得是自己想复杂了,暂时不会做,下周再来算算。

总结

也是近段时间开始刷LeetCode算法题的。发现一拿到题目或许心中会冒出好多种解法,有的解法是朝着正确的方向一气呵成代码简洁雅致,有的解法跑斜了代码冗余逻辑复杂,有的解法南辕北辙写着写着删除重来。实践发现在大多数情况下,若经过纸笔的预先周全演算不会出现最后一种情况,顶多就是演算了半天稿纸撕了几张还没解决方案嘛_。近两个星期所做题目都是没有经过纸笔或其它记录式的演算,直接进行代码实现,于是乎频频出现第三种情况(就像今天的contest)。嗯,就像做项目一样,要按软件工程的思想步步为营亦可避免不必要的损耗。

时间到了,本周的算法学习配额时间已用完,下周再来搞,嘻嘻。第一篇一篇博客写了一个半小时。。。。

各位大佬多多指教,有不足的地方欢迎探讨学习。_

记LeetCode第143次周赛(Weekly Contest 143)相关推荐

  1. LeetCode第176场周赛(Weekly Contest 176)解题报告

    又是一周掉分之旅,我发现,LeetCode周赛的数据好水,所以有的时候,实在没思路,先暴力解决试试(即使分析出时间复杂度会超时),比如第二题和第三题都可以暴力通过,GG思密达. 这周主要使用了数据结构 ...

  2. LeetCode第187场周赛(Weekly Contest 187)解题报告

    差点又要掉分了,还好最后几分钟的时候,绝杀 AK.干巴爹!!! 第一题:思路 + 模拟暴力. 第二题:线性扫描. 第三题:双指针(滑动窗口) + 优先队列. 第四题:暴力每一行最小 k 个 + 优先队 ...

  3. LeetCode Weekly Contest 25 之 545.Boundary of Binary Tree

    LeetCode Weekly Contest 25 赛题 本次周赛主要分为以下4道题: 507 Perfect Number (3分) 537 Complex Number Multiplicati ...

  4. LeetCode之Weekly Contest 90

    LeetCode第90场周赛记录 第一题:亲密字符串 问题: 给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true :否则返回  ...

  5. LeetCode笔记:Weekly Contest 280

    LeetCode笔记:Weekly Contest 280 1. 题目一 1. 解题思路 2. 代码实现 2. 题目二 1. 解题思路 2. 代码实现 3. 题目三 1. 解题思路 2. 代码实现 4 ...

  6. Leetcode 第133场周赛解题报告

    今天参加了leetcode的周赛,算法比赛,要求速度比较快.有思路就立马启动,不会纠结是否有更好的方法或代码可读性.只要在算法复杂度数量级内,基本上是怎么实现快速就怎么来了. 比赛时先看的第二题,一看 ...

  7. LeetCode第 227 场周赛题解

    LeetCode第 227 场周赛题解 检查数组是否经排序和轮转得到 原题链接 https://leetcode-cn.com/problems/check-if-array-is-sorted-an ...

  8. LeetCode 第 194 场周赛

    LeetCode 第 194 场周赛 数组异或操作 思路和代码 保证文件名唯一 思路及代码 避免洪水泛滥 思路及代码 找到最小生成树里的关键边和伪关键边 思路及代码 这次周赛比以往难很多. 数组异或操 ...

  9. Acwing第72场周赛+Leetcode第314场周赛

    Acwing第72场周赛 第一题:AcWing 4624. 最小值 分析:向下取整可以用到math.h头文件中的floor()函数,最后输出时套用两个min()函数求三个数的最小值即可. 代码: #i ...

最新文章

  1. layui根据条件显示列_layui按条件隐藏表格列的实例
  2. python多版本和隔离环境配置
  3. FastStone Capture
  4. 阿里云携手微软与 Crossplane 社区发布 OAM Kubernetes 标准实现与核心依赖库
  5. 浅谈积性函数求前缀和
  6. 抓住那头牛(信息学奥赛一本通-T1253)
  7. 斐波那契数列(Fibonacci)递归和非递归实现
  8. 支付宝五福活动抢先开始了!原来今年可以提前集
  9. AfxGetApp用法
  10. devsecops automation
  11. 计算机日常英语,计算机英语的常用句子
  12. python--之np.any,np.a;;
  13. PHOTOSHOP使用总结
  14. 微博爬虫思路:Python通过移动端接口爬取,简单易操作
  15. OpenCV图像处理----图像的二值化
  16. EMC测试、安规测试、环境测试
  17. S32K1xx 系列安全手册
  18. php抽奖幸运,幸运大转盘-jQuery+PHP实现的抽奖程序
  19. 使用Air724UG模块拍摄照片并上传至云服务器
  20. 深度分析|2017阿里双十一1682亿背后的营销隐秘

热门文章

  1. 新华三抢鲜首发Wi-Fi 7新品,你离Wi-Fi 7时代有多近?
  2. 美团Java面试题,java找不到工作要不要先去干别的
  3. 经典学经:笨人学数学的方法
  4. 【计算机系统基础02】二进制,八进制,十进制,十六进制的表示与转换
  5. UE4 闪电材质 及 闪电特效制作Niagara 学习笔记
  6. [R]如何利用rnorm生成亂數矩陣和時間序列亂數?
  7. ftp iis 不支持 FTP over TLS
  8. git pull 配置免密_git仓库免密码登陆配置
  9. openCV SDK 下载地址
  10. hdu4528小明系列故事——捉迷藏(bfs)