摘要:
在白色6*6方格表中染红一些方格,使得每行每列都恰好有两个红格,求不同的染法数目。 如果染色方案A得到的方格表可以通过交换行或列得到染色方案B,则称AB方案是等价的。 经分析可知,一共有三种”基本的染色方案“,这三种染色方案互不等价,并且所有的染色方案都可通过这三种基本方案交换行或列得到。 基本方案 阅读全文
摘要:
有一个无序的数组,数组一共有n个元素且元素大小各不相同,每一次操作都可以把某一个元素提到数组的最前边,问至少经过多少次操作后可以把数组变为升序数组。 新建一个二维数组a[2][n],将数组降序排序存入a[1],将其下标存入a[2],令a[2]中第一个不满足a[2][m]<a[2][m-1]的m为l, 阅读全文
摘要:
最大公约数和最小公倍数的乘积就是原两个数的积 i=j<<1 等价于 i=2*j i=j>>1 等价于 i=j/2 i=j|1 等价于 i=j+1 有一个数组,现在要求输出从小到大的数的序号。有三种方法,第一个是结构体法,结构体中一个元素放序号,一个元素放该序号对应的数字。 这样结构体就按照time的 阅读全文
摘要:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { int len1=1;//记录l1的长度 int len2=1;//记录l2的长度 ListNode* p=l1; ListNode* q=l2; while(p->next!=NULL)// 阅读全文
摘要:
双指针思想,i为慢指针,指向当前子串开始位置,j为快指针,指向当前判断的字符idx[s[j]]记录字符s[j]上次出现的位置每次迭代记录字符出现位置当字符s[j]上次出现的位置大于当前子串开始位置i时,比较当前子串长度与目前为止所有子串最大长度,取最大,同时将开始位置设为字符s[j]上次出现位置的下 阅读全文
摘要:
1.缺失的第一个正数 要求时间复杂度应为O(n),空间复杂度为常数。 方法一:哈希表(空间复杂度不符合要求)按照刚才我们读例子的思路,其实我们只需从最小的正整数 11 开始,依次判断 22、 33 、44 直到数组的长度 N 是否在数组中。 如果当前考虑的数不在这个数组中,我们就找到了这个缺失的最小 阅读全文
摘要:
二叉树的前序遍历 class Solution { vector<int> a; public: vector<int> inorderTraversal(TreeNode* root) { d(root); return a; } void d(TreeNode* x) { if(x==NULL) 阅读全文
摘要:
双指针思想,i为慢指针,指向当前子串开始位置,j为快指针,指向当前判断的字符idx[s[j]]记录字符s[j]上次出现的位置每次迭代记录字符出现位置当字符s[j]上次出现的位置大于当前子串开始位置i时,比较当前子串长度与目前为止所有子串最大长度,取最大,同时将开始位置设为字符s[j]上次出现位置的下 阅读全文
摘要:
方法一: 一次遍历直觉 本问题被称为 荷兰国旗问题,最初由 Edsger W. Dijkstra提出。其主要思想是给每个数字设定一种颜色,并按照荷兰国旗颜色的顺序进行调整。 我们用三个指针(p0, p2 和curr)来分别追踪0的最右边界,2的最左边界和当前考虑的元素。 本解法的思路是沿着数组移动 阅读全文
摘要:
今天就来聊三道考察频率高,而且容易让人搞混的算法问题,分别是求子集(subset),求排列(permutation),求组合(combination)。这几个问题都可以用回溯算法解决。 一、子集问题很简单,输入一个不包含重复数字的数组,要求算法输出这些数字的所有子集。 vector<vector<i 阅读全文