Leetcode medium (一)

  1. Patching Array
    找出数组中的补丁元素个数,使其可以生成1-n的所有数字;

    找出缺少的元素miss,刚开始[0,miss=1),则表示当前数字生成最大连续数字范围为[0,miss),如果nums[i]<=miss, 则表示加入该元素之后可以生成miss值,且范围扩大到[0,miss+nums[i]),反之,则说明缺少miss元素,则加入miss元素,则范围变为[0,2*miss)。直到miss>n,停止。

  2. Single Number
    一个数组,除了一个元素之外其他元素均出现2次,找出该元素。

    两个元素相同异或为0,0和某一元素异或为该元素。所以遍历数组,异或一遍即为所求。

  3. Single Number II
    一个数组,除了一个元素之外其他元素均出现3次,找出该元素。

    int类型,则有32位。针对第i位,记录该位出现1的个数count,count%3则位所求元素第i位的值,因为相同元素出现3次,必为3的倍数,得到的余数是由于所求元素造成的。

  4. Single Number III
    一个数组,除了2个元素出现1次外其他元素均出现2次,找出这两个元素,不考虑先后顺序。

    假如这两个元素是a,b,根据single number I可以找出a^b=result,我们的目的是区分出a,b来。
    易知,result中出现1的地方必定是a、b中一个此位是1,另一个是0。
    任何数和某位是1其他位是0(其他位为0相与均变为0)的数进行&操作不改变该元素这一位上的数,结果为0表示该元素此位位0,大于0表示该元素此位是1.
    则我们只需要找出result中某一位是1的数,用其和所有元素&,则会将a、b两个元素分开,也会将所有元素分成两部分。每部分相异或,则会分别得到a、b。
    关于找出result中某一位是1,其他位为0:n&(n-1)表示将n的最末尾一位1变为0,我们要做的就是只保留最末尾一位的1,则n&(~(n-1))

  5. Product of Array Except Self
    一个数组,除此位元素外其他元素相乘。

    考虑一个数组中,只有一个元素位0的情况。

  6. Bulb Switcher
    初始灯泡为off,第i次更改i的倍数位的灯泡的状态,则求最终有多少灯泡亮。

    想到了某一位灯泡的状态和此位的因数个数有关。因数个数为奇数,则为on,反之为off。
    综上,所以只与因数个数的奇偶有关。而对一个数,因数都是成对出现的(偶数个),除了平方数1,4,9等。
    所以此题转化为求1~n中有多少个平方数的问题。直接sqrt(n)即为所求。

  7. Maximum Product of Word Lengths
    找出两个words没有相同元素,返回最大的length(word[i]) * length(word[j])

    关键怎样快速区别两个words中没有相同元素。将每一个words转化为二进制int型,因为一共有26个字母,位数完全够用。如果该字母出现,二进制此位为1(num[i] |= 1 << (words[i].charAt(j) - ‘a’))。二进制数两两相与,为0表示没有相同的字母。

  8. Unique Binary Search Trees
    给定n,给出1~n可形成二查搜索树的个数。

    其实每个节点作为根几点,除去其,剩下的n-1个节点,左测若i个,右侧则为n-i-1个节点,则左右可形成个数相乘则为去(i,n-i-1)时可形成的二查搜索树的情况。动态规划,从底向上依次得到1~n个节点时二叉树的个数。

  9. Kth Smallest Element in a BST
    求二查搜索树中第k小元素

    二叉搜索树中根遍历为升序排序数据,则找左子树节点个数,如果等于k-1,则为root;
    如果大于,则在左子树中找第k小元素;
    如果小于,则在右子树中找第k-left-1小元素。

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

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

你可能感兴趣的:(Leetcode medium (一))