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;
}
};
`