2018 11 24 ARTS(6)

  • Algorithm:每周至少做一个leetcode的算法题;
  • Review:阅读并点评至少一篇英文技术文章;
  • Tip/Tech:学习至少一个技术技巧;
  • Share:分享一篇有观点和思考的技术文章;

Algorithm

本周的题目:本周做的题目都是简单题。

941. 有效的山脉数组

https://leetcode-cn.com/contest/weekly-contest-111/problems/valid-mountain-array/ 思路简单,其实看看都会做,不上代码了。

字符的最短距离

https://leetcode-cn.com/problems/shortest-distance-to-a-character/description/ 这题简单的很,就不上代码了。

汉明距离

https://leetcode-cn.com/problems/hamming-distance/description/ 这个也是很简单的,基本就是看你怎么算一个数字的二进制了,但是如果你精通位运算,那就更快了

杨辉三角

https://leetcode-cn.com/problems/pascals-triangle/description/ 这里很经典了。也不上代码了

最小路径和

https://leetcode-cn.com/problems/minimum-path-sum/description/ 这里是我觉得是我这个礼拜做的有点难的问题了。值得说一说,先说一下啊,这里要用到动态规划,我以前对动态规划其实是没学好的,因为这题我找了些资料看了下,这里解题思路最好说一说。先来举个例子:

[ [1,2,3,4], [1,2,4,3], [2,3,5,5], [4,3,7,8] ]

用这写数据按照题目的意思走一边,其实解决动态规划的问题的的要点,我个人感觉就要会画表,画表的重点则是你要懂得在横纵的表上数据代表什么。如果你搞懂了画表的奥义,那我觉得能解决一部分的动态规划问题了。

这里的我们先做一张这样的表,你要在每个空格里面填入从别的来到这个格子的最小值,当然因为题目的限制,所以咱们知道,这个只能从左边来或者从上面来。好了我们开始填表了,先填第一行,因为第一行的数字只有左边的数字,没有上边的数字,所以,第一行的数字就是所在的位置的数字和前面的数字的和的累加。依次就是[1,3,6,10],这里就代表者如果你从第一行的第一个数字到了第一行的最后一个数字,那么你的最小的路径和就是10,如果从第一行的第一个数字到了第一行的第三个数字,那么你的最小的路径和就是6;表的填充图暂时是这样:

开始填第二行,能到第二行第一个,只能从第一行第一个来,所以第二行第一个就是1+1=2,到第二行第二个的位置,只能从上面的3来,或者从左边的第二行第一个来,比较一下两者的数值,不难发现,第二行第一个的值比第一行第二个小,那么我们决定从第二行第一个的位置来,依次类推,第二行的数组就是[2,4,8,11],图如下:

根据上面规则开始继续推算,第三行的数组就是[4,7,12,16], 第四行的数组就是[8,10,17,24],总的效果图如下

这些一定要你自己动手画一画,想一想,就很好理解了,如果自己不动手的,还是会有点似懂非懂的。 经过自己的这番思考,大概懂了吧,这个表里的最小值就是原来的二维数组的值加上,左边和上边的最小值。比如咱们的最后一个值24就是 = 两者最小值(16,17) + 8,也就是:16+8了。 需要先用个minPath[n][m]来存放当前位置的最小值,所以最核心的公式:

minPath[i][j] = Math.min(minPath[i-1][j], minPath[i][j-1]) + grid[i][j]

这里的grid就是原来输入的数组,这里直接上代码了:

class Solution {
    public int minPathSum(int[][] grid) {
        int lengthHeng = grid[0].length;
        int lengthZong = grid.length;
        int[][] temp = new int[lengthZong][lengthHeng];
        for (int i = 0; i < lengthZong; i++) {
            for (int j = 0; j < lengthHeng; j++) {
                if (i == 0 && j == 0) {
                    temp[0][0] = grid[0][0];
                } else if (i == 0) {
                    temp[0][j] = grid[0][j] + temp[0][j -1];
                } else if (j == 0) {
                    temp[i][0] = grid[i][0] + temp[i-1][0];
                } else {
                    temp[i][j] = Math.min(temp[i - 1][j], temp[i][j - 1]) + grid[i][j];
                }
            }
        }
        return temp[lengthZong - 1][lengthHeng - 1];
    }
}

Review

Intro to Congestion Control

这篇文章介绍了一个TCP的堵塞控制的方案,叫做Tahoe。这个是19世纪80年代的时候出的一个方案。当然现在有了更新的算法了,其实看完还是有点一头雾水,因为看英文是真的吃力,很多专业名词不懂。大概就看到几关键点,堵塞窗口:我理解就是用来控制每次发几个数据分片的,还有这个方案的一定要慢启动,其实我没咋搞懂啥子慢启动,回头要多看几遍(这个未完待续啊);还有这个方案的丢包和重传机制。 要配合这个笔记来理解更好的。 Demonstrating TCP Congestion Control

Tip/Tech

1 本周为了做算法题专门恶补了下原来就没有学好的动态规划。 2 放弃了原来的springboot初始化的redis的方式,决定用新的方法试试

Share

10 Bad Habits To Avoid As A Developer 10个开发者应该避免的坏习惯 1 没有获得充分的休息 2 拒绝向别人寻求帮助 3 当你不作为一个学生(技术在变化要持续学习) 4 垃圾代码 5 糟糕的工作和生活的平衡 6 特别烂的办公室政治 7 没有从错误中吸取教训 8 放弃太早 9 以为自己啥都知道 10 拒绝采纳有建设性的批评

转载于:https://my.oschina.net/jamesfuxk/blog/2890663

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值