算法刻意练习第一天--复杂度分析以及学习方法

时间复杂度

算法时间复杂度分析,复杂度越低,大数据量,高并发环境下,收益很高

1 + 2 + 3+ … + n
求和公式: y = n*(n+1)/2

Fibonacci 时间复杂度计算

F(n) = F(n-1) + F(n-2)
时间复杂度:O(2^n) 并不是特别有效的算法

查用查找算法的时间复杂度是多少:
二分查找 – Log(n)
二叉树遍历 O(n)
二维度矩阵 O(n)
快排 --n*log(n)

如何通过Leetcode进行算法的练习

训练算法和数据结构的网站:
三分学习,7分练
坚持、刻意练习,不要只做自己会做的题,而要做常考的算法,自己不会的题,如动态规划等
训练的时候,不爽,不舒适,正常的,跳出自己的舒适区,说明你在成长
训练算法的网站:leetcode

1、数据的范围,比较阴险的地方。
2、所有的算法解法,都找到,找到时间和空间复杂度最优的

例:两数之和解题思路

1、O(n^2) 解法,直接两层for循环求解
2、定义一个Map存储上一个值,Key:存储数组之前位置对应的数值,value存储数值对应的位置
由于HashMap key查找时间复杂度为O(1),利用这一特性,在通过target - 数组当前遍历的值 ,去hashMap中查找,如果查找到的话,即返回。

代码

class Solution {
     public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map = new HashMap<>();
        int[] position = new int[2];
        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(target - nums[i]) {
                position[0] = map.get(target - nums[i]);
                position[1] = i;
                return position;
            }else {
                map.put(nums[i],i);
            }
        }
        return position;
    }
}

3、官方提供三种解法,第一种,两层循环,第二种,两次循环,第三种,一层循环;

总结:
1、做题,不要只找一种解法,要找到所有的解法
2、对时间和空间复杂度进行分析
3、找一款自己舒适的代码编辑器

FeedBack 反馈

最好通过看solution 进行学习对比,对比自己的代码,找到优势和不足

机会是六个有准备的人

坚持!!!

你可能感兴趣的:(数据结构)