- Maximum Product of Word Lengths
针对stings数组,找出两个字符串中没有公共元素长度乘积的最大值。
- 自己思路: 双重循环,一个用一个分割,但是如果涉及两个都是重复元素,效率还是很低:
str2.split(String.valueOf(str1.charAt(i))).length > 1- 正确思路: 因为都是小写字符,所以将两个string类型转化为int类型,每个位置0|1表示这个位置是否有对应的字符。那么两个int值取并是否为0即可。
num[i] |= 1 << (words[i].charAt(j) - ‘a’);
(nums[i] & nums[j]) == 0;
- Linked List Cycle
判断条件的关键:
while (one != null && two != null && two.next != null )
- Populating Next Right Pointers in Each Node I II
找同一层的下一个节点为next。
- 自己思路: 层次遍历,两个queue,存node和level,null条件:
nodes.isEmpty() || levels.peek() == level + 1- 好的思路:通过上一层的next可以求出下一次儿子节点对应的next。若有当前节点有左右儿子,左的next即为右,右的next即为其的next对应的儿子节点,其他类似。
p->left->next = p->right;
p->right->next = p->next->left;
- Unique Binary Search Trees
输入n,1~n可以组成的二叉搜索树(左小于根,右大于根)个数。
分析:1~n每个点作根节点,则第i个点作根节点时,左侧有i-1个节点(因为1~i-1均比i小,所以在左侧),右侧有n-i个节点,则有左侧树个数*右侧树个数。
for (int i = 2; i < n+1; i++){
count[i] = 0;
for(int j = 1; j < i+1; j++){
count[i] += count[j-1]*count[i-j];
}
}
- Bulb Switcher
灯泡开关,刚开始为off,第i次为i的倍数的灯亮
自己思路:和因数个数(包括1)有关,奇数为on,偶数为off。则统计因数为奇数个的数即可。
更简单思路:第i个数,sqrt(i)为中心,因数是对称的,因此,如果有此数是平方数,则因数个数为奇数,反之为偶数。而n的范围内平方数有sqrt(n)个。
- Maximum Subarray
最长子序列和
http://blog.youkuaiyun.com/hs794502825/article/details/7956730
- 必定以正数开头,因为,如果a1>0,a2~ak为最长子序列,则加上a1之后则更长;
- 同理,如果a1~ai为正,则ai+1~ak为最长,则必加上前者才为最长子序列;
- 则在计算过程中,以ai开始,如果为正,则计算直至aj为负重新清0,ai+1到aj之间不可能出现开头,因为如果以其中某个开头,以1-2可知,则必可以以ai开头。接着以aj+1开始算,记录这个过程中最大子序列。
int maxSubSum3_4( const vector<int> &a ){
int maxSum = 0;
int thisSum = 0;
for(int j=0; j<a.size(); j++ )
{
thisSum += a[j];
if(thisSum>maxSum)
{ maxSum = thisSum; }
else if( thisSum>0 )
{ //do nothing }
else if( thisSum < 0 )
{ thisSum = 0; }
}
return maxSum;
}
- Unique Paths
从(1,1)走到(m,n),只能往下往右走
C(i,j) = C(i-1,j) + C(i,j-1) // 到达(i,j)点可能是从上(i,j-1)或者从左边(i-1,j)过来的,所以得到上式
- Generate Parenthesis
输入n,左右括号匹配,返回所有可能的字符串
递归思路:如果左右括号均为0,则将该字符串加入list;如果左边大于0,加左括号;如果右边大于0,并且左边剩余的小于右边,则可以加右括号。
- 求数组任意i和j之间数字之和,最快(i<=j)
数组变量b,存放从o到k的sum存放在b[k]中,则i~j之间和直接为:b[j] - b[i]即可