随笔分类 -  算法学习笔记

摘要:最大公约数和最小公倍数的乘积就是原两个数的积 i=j<<1 等价于 i=2*j i=j>>1 等价于 i=j/2 i=j|1 等价于 i=j+1 有一个数组,现在要求输出从小到大的数的序号。有三种方法,第一个是结构体法,结构体中一个元素放序号,一个元素放该序号对应的数字。 这样结构体就按照time的 阅读全文
posted @ 2020-05-02 21:24 刘通1997 阅读(195) 评论(0) 推荐(0)
摘要:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { int len1=1;//记录l1的长度 int len2=1;//记录l2的长度 ListNode* p=l1; ListNode* q=l2; while(p->next!=NULL)// 阅读全文
posted @ 2020-05-02 21:23 刘通1997 阅读(178) 评论(0) 推荐(0)
摘要:双指针思想,i为慢指针,指向当前子串开始位置,j为快指针,指向当前判断的字符idx[s[j]]记录字符s[j]上次出现的位置每次迭代记录字符出现位置当字符s[j]上次出现的位置大于当前子串开始位置i时,比较当前子串长度与目前为止所有子串最大长度,取最大,同时将开始位置设为字符s[j]上次出现位置的下 阅读全文
posted @ 2020-04-29 23:04 刘通1997 阅读(158) 评论(0) 推荐(0)
摘要:1.缺失的第一个正数 要求时间复杂度应为O(n),空间复杂度为常数。 方法一:哈希表(空间复杂度不符合要求)按照刚才我们读例子的思路,其实我们只需从最小的正整数 11 开始,依次判断 22、 33 、44 直到数组的长度 N 是否在数组中。 如果当前考虑的数不在这个数组中,我们就找到了这个缺失的最小 阅读全文
posted @ 2020-04-29 23:02 刘通1997 阅读(204) 评论(0) 推荐(0)
摘要:二叉树的前序遍历 class Solution { vector<int> a; public: vector<int> inorderTraversal(TreeNode* root) { d(root); return a; } void d(TreeNode* x) { if(x==NULL) 阅读全文
posted @ 2020-04-29 21:43 刘通1997 阅读(151) 评论(0) 推荐(0)
摘要:双指针思想,i为慢指针,指向当前子串开始位置,j为快指针,指向当前判断的字符idx[s[j]]记录字符s[j]上次出现的位置每次迭代记录字符出现位置当字符s[j]上次出现的位置大于当前子串开始位置i时,比较当前子串长度与目前为止所有子串最大长度,取最大,同时将开始位置设为字符s[j]上次出现位置的下 阅读全文
posted @ 2020-04-28 16:55 刘通1997 阅读(130) 评论(0) 推荐(0)
摘要:方法一: 一次遍历直觉 本问题被称为 荷兰国旗问题,最初由 Edsger W. Dijkstra提出。其主要思想是给每个数字设定一种颜色,并按照荷兰国旗颜色的顺序进行调整。 我们用三个指针(p0, p2 和curr)来分别追踪0的最右边界,2的最左边界和当前考虑的元素。 本解法的思路是沿着数组移动 阅读全文
posted @ 2020-04-20 22:10 刘通1997 阅读(360) 评论(0) 推荐(0)
摘要:今天就来聊三道考察频率高,而且容易让人搞混的算法问题,分别是求子集(subset),求排列(permutation),求组合(combination)。这几个问题都可以用回溯算法解决。 一、子集问题很简单,输入一个不包含重复数字的数组,要求算法输出这些数字的所有子集。 vector<vector<i 阅读全文
posted @ 2020-04-18 21:47 刘通1997 阅读(248) 评论(0) 推荐(0)
摘要:a + b 的问题拆分为 (a 和 b 的无进位结果) + (a 和 b 的进位结果) 1. 无进位加法使用异或运算计算得出2. 进位结果使用与运算和移位运算计算得出3. 循环此过程,直到进位为 0 class Solution { public int getSum(int a, int b) { 阅读全文
posted @ 2020-04-16 20:25 刘通1997 阅读(145) 评论(0) 推荐(0)
摘要:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次 public: ListNode* deleteDuplicates(ListNode* head) { struct ListNode* p=head; while(p!=NULL&&p->next!=NULL) { if(p->val 阅读全文
posted @ 2020-04-15 18:30 刘通1997 阅读(120) 评论(0) 推荐(0)
摘要:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 你可以假设数组中无重复元素。 示例 1: 输入: [1,3,5,6], 5输出: 2示例 2: 输入: [1,3,5,6], 2输出: 1示例 3: 输入: [1,3,5,6], 阅读全文
posted @ 2020-04-14 23:24 刘通1997 阅读(227) 评论(0) 推荐(0)
摘要:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 方法一:双指针思路 既然问题要求我们就 阅读全文
posted @ 2020-04-14 15:53 刘通1997 阅读(626) 评论(0) 推荐(0)
摘要:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 class Solution { public: vector<vector<int> > t 阅读全文
posted @ 2020-04-12 17:46 刘通1997 阅读(234) 评论(0) 推荐(0)
摘要:1.应用于查找的find()函数 #include<iostream>#include<string>using namespace std;int main(){ string str; cin>>str; cout<<"ab在str中的位置:"<<str.find("ab")<<endl; // 阅读全文
posted @ 2020-04-11 18:29 刘通1997 阅读(174) 评论(0) 推荐(0)
摘要:一、逻辑运算符 &&(短路与)特点:只要碰到了false或者等价于false的就短路,只要短路了就不会继续往后执行了。如果短路了,得到造成短路的这个值,如果不短路,得到的是第二个值 console.log( true && true ); // trueconsole.log( 123 && '中国 阅读全文
posted @ 2020-04-10 21:45 刘通1997 阅读(460) 评论(0) 推荐(0)
摘要:1 二维向量/点、计算几何基础 const double eps = 1e-8; #define lt(x, y) ((x) < (y) - eps) #define gt(x, y) ((x) > (y) + eps) #define le(x, y) ((x) <= (y) + eps) #de 阅读全文
posted @ 2020-04-09 11:50 刘通1997 阅读(158) 评论(0) 推荐(0)
摘要:1 IO 优化 #define ID isdigit(c = *next++) #define IS isspace(c = *next++) struct Istream { int size; char *next, buf[20030731]; Istream & init(FILE *f = 阅读全文
posted @ 2020-04-09 11:47 刘通1997 阅读(102) 评论(0) 推荐(0)
摘要:1 并查集 (不封装,按秩合并) int ancestor(int x) {return p[x] == x ? x : (p[x] = ancestor(p[x]));} bool test(int x, int y, bool un = false) { if ((x = ancestor(x) 阅读全文
posted @ 2020-04-09 11:44 刘通1997 阅读(132) 评论(0) 推荐(0)
摘要:1 双向邻接表 inline void addedge(int u, int v) { to[++E] = v, next[E] = first[u], first[u] = E; to[++E] = u, next[E] = first[v], first[v] = E; } 2 有向图的强连通分 阅读全文
posted @ 2020-04-09 11:41 刘通1997 阅读(157) 评论(0) 推荐(0)
摘要:1 深度优先搜索 (dfs,大法师) // implementation 1 void dfs(int x){ int i, y; // do something for(i = first[x]; i; i = next[i]) if((y = to[i]) != p[x]){ p[y] = x; 阅读全文
posted @ 2020-04-09 11:37 刘通1997 阅读(135) 评论(0) 推荐(0)