ARTS打卡第一周

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^

你可能感兴趣的:(ARTS打卡第一周)