【代码随想录】鱼与钰遇雨数据结构与算法刷题笔记

代码随想录

https://www.programmercarl.com/

编程素养

代码风格

C++代码风格参考google C++ style Guide
【代码随想录】鱼与钰遇雨数据结构与算法刷题笔记_第1张图片
我使用的是驼峰命名法,其中空格留白的规则如下例:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
            if (nums[fastIndex] != 0) {
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        for (int i = slowIndex; i < nums.size(); i++) {
            nums[i] = 0;
        }
    }
};
  1. 操作符左右有空格
  2. 分割符 , ; 后有空格,类似于写英文文章
  3. 控制语句后有空格
  4. 大括号和函数保持在同一行 (Google规范是 大括号和 控制语句保持同一行的)

写算法题目是否用库函数的标准是什么?

如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。

如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,那么直接用库函数。

使用库函数最大的忌讳就是不知道这个库函数怎么实现的,也不知道其时间复杂度,上来就用,这样写出来的算法,时间复杂度自己都掌握不好的。

例如for循环里套一个字符串的insert,erase之类的操作,你说时间复杂度是多少呢,很明显是O(n^2)的时间复杂度了。

在刷题的时候本着我说的标准来使用库函数,相信对大家回有所帮助!

算法性能分析

时间复杂度

什么是时间复杂度? 时间复杂度是一个函数,它定性描述某个算法的运行时间。
对于一个算法(或者程序)我们通常会估算它的操作单元数量(例如排序中的比较操作)来代表程序消耗的时间;
假设算法的问题规模为n(即操作的最小数据元素为n。例如排序问题中待排序列长度为n),则得到该问题规模下操作单元数量计算公式f(),那么对于问题规模为n的模型,操作单元数量的计算公式为f(n),其中,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这一现象中的增长率称作为算法的渐近时间复杂度,简称时间复杂度,记为 O(f(n))。

其中,O代表上界的,当用它作为算法的最坏情况运行时间的上界,就是对任意数据输入的运行时间的上界。

算法超时问题

首先,算法是否超时喝计算机的配置有关,1GHz=10亿Hz (Hz是赫兹单位)
1Hz 是CPU的一次脉冲(可以理解为一次改变状态,也叫时钟周期),1Hz=1/s,就是一秒1次脉冲,10亿Hz,就是一秒10亿次脉冲。并不是说1次脉冲代表一次计算机的运算,例如对于一个加法运算,cpu要执行四次才能完整这个操作,步骤一:把1放入寄存机,步骤二:把2放入寄存器,步骤三:做加法,步骤四:保存3。 同时存在有多个程序使用CPU的情况。

那我们的计算机究竟1/s能经过多少次运算呢,可以通过代码测试:测试硬件:2015年MacPro,CPU配置:2.7 GHz Dual-Core Intel Core i5 。
1s能进行k++操作 5 × 1 0 8 5\times10^{8} 5×108次。

你可能感兴趣的:(算法的术与道,算法,c++,leetcode)