前言
除了去年11月份以及今年近几月的算法刷题之外,只有在当时20年蓝桥杯准备的时候才刷过一些题,在当时就有接触到一些动归、递归回溯、贪心等等,不过那会也还是一知半解,做的题目也特别少,因为考虑到之后面试有算法题以及数据结构算法对于一个程序员十分重要,我也开始了刷题之路。
我目前的学习数据结构与算法及刷题路径:
1、学习数据结构的原理以及一些常见算法。
2、代码随想录:跟着这个github算法刷题项目进行分类刷,在刷题前可以学习一下对应类别的知识点,而且这里面每道题都讲的很详细。
3、牛客网高频面试101题:牛客网—面试必刷101题,在刷的过程中可以在leetcode同步刷一下。
4、接下来就是力扣上的专栏《剑指offer II》、《程序员面试金典(第 6 版)》…有对应的精选题单来对着刷即可。
5、大部分的高频面试、算法题刷完后,就可以指定力扣分类专栏进行一下刷题了。
刚开始刷的时候真的是很痛苦的,想到去年一道题可能就需要好几小时,真的就很难受的,不过熬过来一切都会好起来,随着题量的增多,很多题目你看到就会知道使用什么数据结构或者算法来去求解,并且思考对应的时间空间复杂度,并寻求最优解,我们一起加油!
我的刷题历程
截止2022.8.18:
1、牛客网101题(其中1题是平台案例有问题):
2、剑指offerII:
力扣总记录数:
加油加油!
剑指offer
剑指 Offer 16. 数值的整数次方【中等】
题目链接:剑指 Offer 16. 数值的整数次方
题目内容:实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
思路1:
1、暴力相乘【超时】
复杂度分析:时间复杂度O(N);空间复杂度O(1)
class Solution {
//溢出问题-2147483648,int最大值2147483647
public double myPow(double x, int n) {
if (n == 0 || x == 1) {
return 1;
}
long num = (long)n;
double res = x;
for (int i = 1; i < Math.abs(num); i++) { //Math.abs(-2147483647) => -2147483647,这是溢出的结果
res *= x;
}
return n < 0 ? (1 / res) : res;
}
}
2、快速幂
复杂度分析:时间复杂度O(logn);空间复杂度O(1)
class Solution {
//3 6
//3x3x3x3x3x3 6次
//3 7
//3x3x3 x3x 3x3x3
//3x3x3=27 27x3=81 4次
public double myPow(double x, int n) {
//边界问题
if (n == 0 || x == 1) {
return 1;
}
long N = (long)n;
double num = pow(x, Math.abs(N));
if (n < 0) {
return 1 / num;
}
return num;
}
public double pow(double x, long n) {
if (n == 0 || n == 1) {
return x;
}
double num = pow(x, n / 2);
//奇数次
if (n % 2 == 1) {
return num * num * x;
}else {
//偶数次
return num * num;
}
}
}