Algorithm:每周至少做一个 leetcode 的算法题
1631. 最小体力消耗路径
class Solution {
/**
* 并查集:根据边的权重排序,然后进行排序 合并
* @param heights
* @return
*/
public int minimumEffortPath(int[][] heights) {
// 算出每条边的权重,
List edges = new ArrayList<>();
int m = heights[0].length;
int n = heights.length;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int id = i * m + j;
// 不用管其顺序,最后要进行排序
if (i > 0) {
edges.add(new int[]{id - m, id, Math.abs(heights[i - 1][j] - heights[i][j])});
}
if (j > 0) {
edges.add(new int[]{id - 1, id, Math.abs(heights[i][j - 1] - heights[i][j])});
}
}
}
// 对边根据权重进行排序
Collections.sort(edges, new Comparator() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[2] >= o2[2] ? 1 : -1;
}
});
Collections.sort(edges, new Comparator() {
public int compare(int[] edge1, int[] edge2) {
return edge1[2] - edge2[2];
}
});
// 初始化并查集
UnionFind uf = new UnionFind(m * n);
// 连接
int ans = 0;
for (int[] edge : edges) {
int x = edge[0], y = edge[1], v = edge[2];
uf.union(x, y);
if (uf.isConnected(0, m * n - 1)) {
return v;
}
}
return ans;
}
class UnionFind {
private int[] parents;
private int count;
private int n;
public UnionFind(int n) {
this.n = n;
count = n;
parents = new int[n];
for (int i = 0; i < n; i++){
parents[i] = i;
}
}
public void union(int p, int q) {
int rootP = find(p);
int rootQ = find(q);
if (rootP == rootQ) {
return;
}
parents[rootP] = rootQ;
count--;
}
private int find(int x) {
while (x != parents[x]) {
parents[x] = parents[parents[x]];
x = parents[x];
}
return parents[x];
}
public boolean isConnected(int p, int q) {
return find(p) == find(q);
}
}
}
思路:
并查集,根据权重进行排序.
Review:阅读并点评至少一篇英文技术文章
网络协议-HTTP官方文档
文档里包含了HTTP的概述(使用的协议、缓存、cookie等)和一些概念(请求头、响应体)等,阅读完对HTTP有了一定的了解.
网络协议在工作中很常见,做Java开发会一些操作流程,直接使用Spring全家桶就可以进行开发,只是知其然,不知其所以然.现在微服务这个大趋势情况下对程序员的技术要求更高,了解网络协议能更好的发展.后续有时间可以看看网络方面的文章及书籍
Tip:学习至少一个技术技巧
阮一峰的RESTful API的设计指南
总结方面后续复习(其实就是照搬,后面看着笔记复习酱紫)
Share:分享一篇有观点和思考的技术文章
从实习到现在工作已快两年,大学里荒废了四年.大四通过去培训机构培训四个月,进入了一家项金融外包公司,期间学习的都是银行的业务知识,领导也是不主张我们学习技术,能用就行,业务要比较熟悉.
后续在网上以及朋友的交流中知道了外包后期出路太少,决定学习一段时间跳槽.正好当时在知乎上刷到了可以通过力扣提高自己的数据结构、逻辑和代码能力,于是开始了刷题之旅,到现在也刷了三百多道题目.买了一些Java、数据库的课程学习,要学的东西太多..买了极客里的好多专栏,感觉学习就像盖房子一样,基础好了才能建造出稳固结实的房子,准备花时间系统的补补大学里拉下的计算机专业课.
学习了半年多面试了一些小公司(都是小公司,我的能力太弱了),今年1月份入职了一家非外包公司,薪资11k,感觉还是挺满意的.脱离了外包公司的开发框架,在写代码时发现自己很多地方不清楚,知道大体逻辑,但是如何将代码写好纠结了好久,幸好写的代码有其他同事对我Code Review,通过他们给我的建议,我再去修改我的代码,收益良多.
希望在以后可以通过这个来记录自己学习和工作、生活上的一些成长
fighting!
^o^