力扣刷题记录

177 阅读1分钟

1.贴一下力扣剑指offer 72

之前考研就写过的题目,当时感觉很难,现在只要把握住:一共遍历的次数也就是子集的数目,转化成二进制之后所有1的位置要加到子集里,这个找1的过程可以用二进制右移,如果能整除2则末位0,反之才加入子集
二进制做 77 — 100 `/**

  • @param {number[]} nums
  • @return {number[][]}

js代码:

    let n = Math.pow(2, nums.length);
    res = [];
    for (let i = 0;i < n;i++) {
        let t = []; 
        for (let j = 0;j < nums.length;j++){
            if ((i >> j) % 2) {
                t.push(nums[j]);
            }
        }
        res.push(t);
    }
    return res;
};`
### 2.剑指offer 53
  [剑指 Offer 53 - II. 0~n-1中缺失的数字](https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof/)
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例:
```
输入: [0,1,3]
输出: 2
```
首先想到的思路是暴力解,逐个比较,把相邻数组元素之差不是一的处理返回,发现暴力解太复杂就换了第二种当时迸发的思路:
下标从0开始到n-1,长度为n-1,也就是说缺的一个数字,正好构成0-n-1,长度为n的有序数组;
能想到这边,自然就想到用下标和对应位置元素比较,不相等就是缺了,返回当前位置+1即为所求
`class Solution {
    public int missingNumber(int[] nums) {
        
        int k=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]!=i)
                return i;
            k=i;
        }
        return k+1;
        
    }
}

思路2:## 求左右子树深度,看深度之差是否大于1
`/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool res=true;
    bool isBalanced(TreeNode* root) {
        dfs(root);
        return res;
        
    }
    int dfs(TreeNode* root){
        if(!root)return 0;
        int l=dfs(root->left),r=dfs(root->right);
        if(abs(l-r)>1) res = false;
        return max(l,r)+1;
    }
};
`