刷leetCode算法题+解析(一)

LeetCode突然就刷爆了我的朋友圈(对,身为IT民工我的朋友圈就是这么窄)。感觉好像没刷过力扣都不配称之为程序猿了。
所以一向随波逐流的我自然而然也就去刷了一波存在感。对,反正刷完出来的我已经在考虑跨行业了。。
好吧,上面是开玩笑的,但是简单的聊聊我所理解的LeetCode。

浅谈LeetCode

LeetCode官网地址
首先我也接触没几天,所以也只能是浅谈。昨天还在和领导探讨按钮上都有文字了还有必要分颜色的审美如我,也没啥可说页面的,反正起码个人感觉这个排版版,真的,上面一排菜单是不是有点小啊?

刷leetCode算法题+解析(一)_第1张图片
力扣首页

反正目前为止,我也只摸索了两个模块:题库,面试
题库的话,我只做了几个标注为简单的题。不过说真的,每一道题都有它自己的逻辑,而且菜鸡如我,几道题能做半天那种,真的有点小难受。
面试目前我也没刷过大厂面试题,都是随机几道题,然后开始做的,这个的好处是有个考试时间,真的很有感觉,让人能专心做下去。
最后,也刷了10+道题了,而且有一直刷下去的决心,但是身为码畜的我要说LeetCode上的题哪怕是简单的也相对比较深,起码在日常小白代码中是接触不到的(起码我这么多工作经验几乎都没用到算法啥的),之前跟朋友聊过这点,就是我觉得这些题很有意思,而且很锻炼思维,我个人很喜欢没事的时候看看。可是他不如看看源码,看看新技术(分布式啊,大数据啊),研究研究一些比较火的知识(例如现在烂大街的区块链)说起来有的讲还高大上还面试加分。
我是真的觉得刷LeetCode是学习一种思维,好几道题,我用几十行代码勉强完成了功能,再查看答案,人家几行十几行也完美的完成了需求。同样是完成,我怎么就想不到那么精巧?做不到那么细致?
当时特别流行的例子:1加到100有的人1+2+3+4...+100,有人的(1+100)*50。都得出了答案,但是第一种做法的人好一点被称为有恒心,坏一点被称作傻子做法。这也就说明思维的重要性。
尤其是刷算法题,可以看解析,看评论,偶尔在群里交流交流,一群人一起学使得我坚持下来。
反正话不多说,我个人是打算刷完LeetCode的(梦想是要有的,万一实现了呢)。然后也尽量刷过的都记录下来,以后忘记了对自己也是个提醒。接下来开始步入正题吧。

-有效三角形的个数

题目:给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。

示例 1:
输入: [2,2,3,4]
输出: 3
解释:
有效的组合是:
2,3,4 (使用第一个 2)
2,3,4 (使用第二个 2)
2,2,3
注意:
数组长度不超过1000。
数组里整数的范围为 [0, 1000]。

这个题其实第一反应应该很容易想到,三角形两边之和大于第三边。这是一个小学就学到的定理。但是落实到代码上要怎么判断呢?我能想到的土方法,就是一个数一个数去比对。因为我代码的注解写的很清楚(也可以说墨迹)了,所以就直接上代码了。
public int triangleNumber(int[] nums) {
        int num = nums.length;
        //如果数组数字少于三,一个三角形都不能构成,所以返回0
        if(num<3){
           return 0;
        }
        //将数组中的数字从小到大排序
        Arrays.sort(nums);
        int result = 0;       
        //遍历每一个数字,然后判断他前面哪些能使它作为第三条边组成三角形
        //第一,二个数字肯定不可能作为长边组成三角形,所以直接从第三个数开始遍历
        for(int i =2;inums[i]){
                    //比如4,5,6,7,8,9,以9为第三边,当4,8满足要求,5,8;6,8;7,8肯定满足要求了的。所以这里满足要求的个数是8的下标4减去4的下标0.也就是四个满足的个数。
                    result+=right-left;
                    //判断玩8,开始判断7.从4,7开始,如果4,7满足说明5,7;6,7都满足需要求,这样下一轮直接加3.最后走到5的时候,4,5不满足,所以跳出这个if,走到else。else让left+1,从第一个元素到了第二个元素,回到了5,不满足最基本的left

以上,有一半是参考了答案解析的吧,主要是一开始我是用的双循环,第一层循环所有的元素,第二层选定一个元素作为第三边,然后再遍历循环前面的元素来判断几种能组成三角形的可能。反正写出来是4层循环。。。
一开始我还在沾沾自喜,别管我用什么方法起码实现了(我选择性忘记了超过三层的循环是代码逻辑有问题)!但是看了答案仅仅几行代码,已经怀疑人生了。先别说我的代码有没有问题,数据多了能不能正常运行,单单我的几十行,人家的几行就打破了所有的喜悦。
于是乎,其实拆开看, right--; left++;都可以作为一种遍历来理解,不过人家的是自己递增遍历,而不需要愚蠢的for循环。仔细看了好久解析,感慨于想出这个办法的人的聪明和代码的精巧。
也让我更加感慨于思路,思维方式的重要性。
至此,这个算法的总结到此为止,如果稍微有帮到你,麻烦点个喜欢点个关注支持下哟。祝大家工作顺顺利利!

你可能感兴趣的:(刷leetCode算法题+解析(一))