1.数组+哈希表+等差数列
class Solution {
public int missingNumber(int[] nums) {
// //1.我的笨方法
// int n=nums.length;
// int res=-1;
// //使用hashmap进行记录,map中先放好0到n共n+1个键值对,
// Map<Integer,Integer> map=new HashMap<>();
// for(int i=0;i<=n;i++){
// map.put(i,i);
// }
// //然后遍历nums,如果map中包含nums中某个元素,就将map中该元素对应的值置为-1
// for(int num:nums){
// if(map.containsKey(num)){
// map.put(num,-1);
// }
// }
// //如果某个键对应的值不是-1,那么这个键就是缺失的元素
// for(int key:map.keySet()){
// if(map.get(key)!=-1){
// res= key;
// }
// }
// return res;
// //2.题解利用等差数列
// int n=nums.length;
// int sum_expect=(0+n)*(1+n)/2;
// int sum=0;
// for(int i:nums){
// sum+=i;
// }
// return sum_expect-sum;
//3.普通for循环
int n=nums.length;
if(nums[0]!=0) return 0;
if(nums[n-1]!=n) return n;
int res=-1;
for(int i=0;i<n-1;i++){
if(nums[i+1]-nums[i]>1){
res=i+1;
}
}
return res;
}
}
2.二叉搜索树+中序遍历:二叉搜索数的第k大节点
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
List<Integer> list=new ArrayList<>();
public int kthLargest(TreeNode root, int k) {
if(root==null){
return root.val;
}
getList(root);
return list.get(list.size()-k);
}
//二叉搜索树中序遍历结果是升序的
public void getList(TreeNode root){
if(root!=null){
if(root.left!=null){
getList(root.left);
}
list.add(root.val);
if(root.right!=null){
getList(root.right);
}
}else{
return;
}
}
}
3.递归:二叉树的深度
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int maxDepth(TreeNode root) {
if(root==null){
return 0;
}
return Math.max(maxDepth(root.left),maxDepth(root.right))+1;
}
}
4.递归:平衡二叉树
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isBalanced(TreeNode root) {
if(root==null){
return true;
}
return isBalancedNode(root) && isBalanced(root.left) && isBalanced(root.right);
}
public boolean isBalancedNode(TreeNode node){
if(node==null){
return true;
}else{
if(Math.abs(height(node.left)-height(node.right))<=1){
return true;
}else{
return false;
}
}
}
public int height(TreeNode node){
if(node==null){
return 0;
}
return Math.max(height(node.left),height(node.right))+1;
}
}
5.异或:数组中数字出现的次数
class Solution {
public int[] singleNumbers(int[] nums) {
//分组异或
int res_total=nums[0];//先求出全部元素的异或结果
for(int i=1;i<nums.length;i++){
res_total=res_total^nums[i];
}
//找到异或结果中最右边不为0的位置
int index=0;
for(int i=0;i<32;i++){
if((res_total>>i&1)==1){
index=i;
break;
}
}
//根据ite将原数组分成两组,因为res_total中从右往左最后一个为1的位置肯定是两个只出现一次数字不同的位置,这个位置上,这两个数一个为1,一个为0.所以通过这个位置进行分组进行异或,就可以找到这两个数字
int a=0,b=0;
for(int num:nums){
if((num>>index&1)==0){
a=a^num;
}else{
b=b^num;
}
}
int[] ans=new int[2];
ans[0]=a;
ans[1]=b;
return ans;
}
}