code

简单算法思想:
剑指offer
编程之美
int
leetcode

算法编程部分主要由C++/python实现,整体感知有以下问题(今后会慢慢更新):

1️⃣对象/操作: 指针 赋值
2️⃣基本数据结构: 字符串 数组 矩阵 链表 栈 队列 树 图 堆
3️⃣排序: 快排 冒泡排 堆排 归并排 选择排
4️⃣查找: 二分查 文件查
5️⃣基本算法思想: 分治 二分 递归 动态规划 贪心
6️⃣注意事项: 先思路后实现,先测试用例后实现,不断优化:空间换时间,时间换空间
7️⃣应用问题:

  1. 赋值: 赋值问题
  2. 字符串: 字符串反转 字符串转数字
  3. 数组: 最长上升子序列 两数组公共子序列 和最大的最长序列 约瑟夫环 找出仅一个重复的数 找出仅两个重复数
  4. 矩阵: O(n)矩阵读写 八皇后
  5. 链表: 链表反转 两个有序链表O(n)内合并成一个有序链表
  6. 栈: 两个栈实现队列 括号匹配(匹配判断)
  7. 队列: 优先级队列
  8. 树: 树的深度 树的前/中/后序递归/非递归遍历 由前/中序生成树 两结点间(不过根)的最大路径 两结点的公共祖先 树的中序遍历逆运用
  9. 图: 图着色 排课表 最短路径 TSP 邮差问题
  10. 堆: topK大
  11. 其他:
    数独问题
    先取完石头问题
    空间换时间: O(n)求2Sum问题(leetcode1)
    左右走对应步数后到达指定数(leetcode754)
    fibonacci数列

【分治】

【分治之二分】

【动态规划】

【贪心】

【递归】

《编程之美》(完了集齐《数学之美》《算法之美》三剑客)

1- 构造数独,99中所有格子填写1~9,每行、列以及33小矩阵中的数都不重复
深度优先搜索,矩阵开始(x,y轴数值为0),到达矩阵末端为止

2- 斐波那契数列
非递归实现

3- 寻找topK
存储每个整数出现的个数,从最大数开始遍历

for(sumCount = 0, v = MAXN - 1; v >= 0; v--){
   sumCount += count[v];
   if(sumCount >= k){
       break;
   }
}
return v;

《剑指offer》
1- 青蛙一次调跳一层或两层阶梯,求共跳n层阶梯的跳法数量
=> 递归斐波那契数列,不过递归开销大,而从1到n循环求出f(n)则时间效率仅为O(n).

2- 求链表倒数第k个节点
=> 两个指针p,q, p先走k-1步,q后与p一起走,当p达到终点q所在位置即为所求倒数第k个节点。
【注】实现过程需考虑k=0与节点总数 【推广】编码前先考虑测试用例,需注意边界值、错误值如字符为空、指针为空、字符转换数值时非数字字符、含负号、最大正整数、最小负整数或溢出等问题。

3- 24点游戏
n个数得到最终的结果m
例如n=4, m=24, 分支的思想。

4- 捡石头简单版
一排石头一次取一个或相邻的两个,先取完的胜出
通过归纳的方法得出,先取的人有必胜策略。

5- 二进制数中1有多少
位运算

while(BYTE v):
   v&=v-1
   num++

print num

6- 数组中出现次数超过一半的数
最后一次使times++对应元素一定是超过一半的元素,时间复杂度O(n)!

leetcode随机n题

1- LeetCode1 求和为定值的两个数

//为求效率还是空间时间吧
//注意map插入的位置是在判断之后,相应的查找后的return顺序是
//时间复杂度O(n), 
class Solution {
public:
    vector twoSum(vector& nums, int target) {
        map pairMap;
        for(int i = 0; i < nums.size(); i++){
            int component = target - nums[i];
            if(pairMap.count(component) > 0){
                return {pairMap.find(component)->second, i};
            }
            pairMap[nums[i]] = i;
        }
        return {-1, -1};
    }
};

2- LeetCode754 从原点开始向左/右走i步,i为从1开始的次数,求到target时候需要走路的次数
//考虑|target|奇偶时的不同情况
//时间复杂度O(asqrt(target)), 空间复杂度O(1)

class Solution{
public:
     int reachNumber(int target){
          target = abs(target);
          int k = 0;
          while(target > 0){
              target -= ++k;
          }
          return target % 2 == 0 ? k : k + 1 + k % 2;
    }
};

3- 找数组中重复的数字 hash表
4- 重建二叉树 根据前中序,递归
5- 用两个栈实现队列 队列增删操作
6- 斐波那切数列 非递归
7- 调整数组顺序使奇数位于偶数前 判断前后标准,拆分数组,交换
8- 链表中倒数第k个节点 两个指针一起走,三个潜在崩溃的风险
9- 反转链表 考虑尾结点位置
10- 合并两个排序的链表 考虑鲁棒性,非空情况下递归合并
11- 二叉树中和为某一值的路径 用栈保存路径,递归,比较更新的当前和与固定值
12- 字符串的排列 全排列,递归
13- 最小的k个数 用partition,修改数组T(n)=O(n)
14- 连续子数组的最大和 判断当前和是否≤0,后更新较大的当前和为最大和,T(n)=O(n)
15- 礼物的最大价值 简化后的数组运算,求最大和
16- 丑数 依次循环,空间换时间
17-二叉搜索树的第k大节点 中序遍历,递归,k减少到1时返回当前节点
18- 二叉树的深度 递归,返回时加上大的深度
19- 翻转字符串 不同于反转链表,先转句子后转每个单词
20- 滑窗口最大值 队列存入、滑出操作
21- 扑克牌中的顺子 ,排序、统计0个数、统计数之间的间隔数,后循环判断
22- 股票的最大利润 循环,保存较小值,T(n)=O(n)

references:
《剑指offer》
《编程之美》
leetcode

你可能感兴趣的:(code)