我要开始定新目标,因为上学期一直在学Java、准备比赛,寒假去学习网安了,没有时间刷算法,开学一周重新拾回算法,打算挑战365天LeetcodeKnight,坚持每天吃透2~3题,我会每周做一次总结。

第一周(3月8号~3月14号):

这周可以说是试错周了,每天的算法类型都是不重样的,但是好多题目都是AI思考,被AI带偏了,现在改变思路,先自己做一遍,把思路写下来,不会再找AI,然后再重新自己写一遍,总结题型、核心思路、易错点。

(例子)

题目:414.第三大的数

  1. 题型
    1. 数组找第K大的元素、简单模拟
    2. - 难度:简单
  2. 核心思路
    1. - 用3个变量保存:第一大、第二大、第三大
    2. - 遍历数组,只更新这3个数
    3. - 比第一大还大:三、二、一依次往后挪
    4. - 比第二大、比第一小:三、二往后挪
    5. - 比第三大、比第二小:更新第三大
    6. - 有第三大就返回,没有就返回第一大
  3. 易错点
    1. - 必须去重,相同数字不算多次
    2. - 初始值要用极小值,不能用0
    3. - 最后要判断:数组是否真的有3个不同数
    4. - 不要用排序,效率低且容易踩坑
  4. 代码
class Solution {
    public int thirdMax(int[] nums) {
        long first = Long.MIN_VALUE;
        long second = Long.MIN_VALUE;
        long third = Long.MIN_VALUE;

        for(int num : nums){
            if(third == num || second == num || first == num){
                continue;
            }
            if(num > first){
                third = second;
                second = first;
                first = num;
            }
            else if(num > second && num < first){
                third = second;
                second = num;
            }
            else if(num > third && num < second){
                third = num;
            }
        }
        if(third == Long.MIN_VALUE){
            return (int)first;
        }
        else{
            return (int)third;
        }
    }
}

第二周(3月15号~3月22号):

这周重新定义了一下做题方法,个人觉得方法挺适合我的,我是不太喜欢跟着视频去学的,因为我是输出形的学习者,不太喜欢输入,除非这道题很难,我才去看视频去详细看他思路。我每天的算法题都是基础题,但是总感觉没有提升自己的水平,马上就要蓝桥杯了,这几周可能刷力扣的时候不会太多,可能每天1题吧,可能这几周都刷蓝桥杯真题了,争取Java组省一、省二吧。因为我也比较喜欢不断踩坑,踩坑才能增加经验,但是也是时间的付出。总之我觉得学计算机总要经历很多失败,才会成功的,即使最终还是失败我也不怪别人,只能怪自己不够努力吧。

这是我这一周所刷的题目,题目不多,因为这周接手师兄项目,忙着改bug

最经典就是这道题目了,让我学到了快速幂

题目:50.Pow(x,n)
实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,x(n)( ))。

  1. 题型:
    1. 快速幂
    2. 二分法
    3. 难度:中等
  2. 核心思路:
    1. 把幂次n拆分成二进制形式,例如 x10=x8∗x2(10 的二进制是 1010)
    2. 每次将幂次折半,底数平方,减少乘法次数,时间复杂度优化到O(log|n|)
    3. 要处理幂小于0的界限
    4. 要处理幂等于0的界限
    5. 要判断幂是否为奇数/偶数
    6. 如果为奇数,折半相乘后还要再乘一次底数
    7. 如果为偶数,折半相乘后即可
  3. 我的状态:
    1. 直接使用库函数,但是觉得这样学不到东西
    2. 不能写,先抄一遍代码,单独写了3遍,才开始理解
  4. 问题:
    1. 不会创建fastPow方法
    2. 没有使用幂次折半
  5. 易错点:
    1. 边界范围
    2. 新建方法来处理符合条件的情况,来计算折半后继续相乘
  6. 代码:
class Solution {
    public double myPow(double x, int n) {
        long exponant = n;
        if(exponant < 0){
            x = 1 / x;
            exponant = -exponant;
        }
        return fastPow(x,exponant);
    }

    private double fastPow(double x,long n){
        if(n == 0){
            return 1.0;
        }

        double half = fastPow(x,n / 2);
        if(n % 2 == 0){
            return half * half;
        }
        else{
            return half * half * x;
        }
    }
}

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐