leetcode思路一

  1. 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;
  1. Linked List Cycle

判断条件的关键:
while (one != null && two != null && two.next != null )

  1. 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;
  1. 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];
            }
        }
  1. Bulb Switcher
    灯泡开关,刚开始为off,第i次为i的倍数的灯亮

自己思路:和因数个数(包括1)有关,奇数为on,偶数为off。则统计因数为奇数个的数即可。
更简单思路:第i个数,sqrt(i)为中心,因数是对称的,因此,如果有此数是平方数,则因数个数为奇数,反之为偶数。而n的范围内平方数有sqrt(n)个。

  1. 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;   
}  
  1. 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)过来的,所以得到上式

  1. Generate Parenthesis
    输入n,左右括号匹配,返回所有可能的字符串

递归思路:如果左右括号均为0,则将该字符串加入list;如果左边大于0,加左括号;如果右边大于0,并且左边剩余的小于右边,则可以加右括号。

  1. 求数组任意i和j之间数字之和,最快(i<=j)

数组变量b,存放从o到k的sum存放在b[k]中,则i~j之间和直接为:b[j] - b[i]即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值