栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

二分二段性/滑动窗口/二叉树

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

二分二段性/滑动窗口/二叉树

154 寻找旋转排序数组中的最小值 II

二分本质上是二段性,而有重复元素的情况下,二段性就被破坏了,要恢复二段性;

因此,可以去掉,头和尾中【相同】的元素,来达到去除不满足的情况;

class Solution {

    public int findMin(int[] nums) {

        int n = nums.length;

        int l = 0, r = n - 1;

        while (l < r && nums[0] == nums[r]) r--;  // 恢复二段性

        while (l < r) {

            int mid = l + r + 1 >> 1;

            if (nums[mid] >= nums[0]) {

                l = mid;//  这样写保证了找到的是最右边的数

            } else {

                r = mid - 1;

            }

        }

        return r + 1 < n ? nums[r + 1] : nums[0]; 

        // 如果r+1 > n ,说明没找到,原数组就是自然排列的,因此,第一个数就是最小的

    }

}

1438 绝对差不超过限制的最长连续子数组 双指针
  public int longestSubarray(int[] nums, int limit) {
      int n =nums.length;
      int ans = 0;
      Deque max = new ArrayDeque<>(),min = new ArrayDeque<>();
      // 创建max,min对应的队列,队列的头部是最值
      //注意队列存的是下标而不是具体元素的值,
      //这样才方便在滑动的时候判断一个元素是否已经不属于左右区间内了
      for(int r=0,l=0;r=nums[max.peekLast()]) max.pollLast(); 
          while(!min.isEmpty()&&nums[r]<=nums[min.peekLast()]) min.pollLast();
          max.addLast(r);
          min.addLast(r);
          // 队列头部存的是两个队列的最值,取出并进行判断
          while(Math.abs(nums[max.peekFirst()]-nums[min.peekFirst()])>limit) {
              l++;
              // 如果取出的元素已经小于左边界了,那么弹出;
              if(max.peekFirst() < l) max.pollFirst();
              if(min.peekFirst() < l) min.pollFirst();
          }
          ans = Math.max(ans, r-l+1);
      }
      return ans;
  }
滑动窗口+双指针

三叶题解分析:https://leetcode.cn/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit/solution/xiang-jie-er-fen-hua-dong-chuang-kou-dan-41g1/

public int longestSubarray(int[] nums, int limit) {
		  int n =nums.length;
		  int l =1 ,r = n;
		  while(l> 1 ; 
              // 通过二分来找到满足mid长度的情况
		  if(check(nums,mid,limit)) {
			  l = mid;
		  }else {
			  r = mid-1;
		  }
		}
		  return r ;
}
	  boolean check (int[] nums,int len,int limit) {
		  int n = nums.length;
		  Deque max = new ArrayDeque<>(),min = new ArrayDeque<>();
		  for(int r=0,l=r-len+1;r= nums[max.peekLast()]) max.pollLast();
			  max.addLast(r);
			  if(!min.isEmpty()&&min.peekFirst()=0&&Math.abs(nums[max.peekFirst()]-nums[min.peekFirst()])<=limit)
                  return true; //找到有一组满足情况时,当前mid便是满足条件的
		  }
          //当找完所有的情况,没有为true时,就返回false 
		  return false ;
	  }
二叉树对称问题 二叉树的镜像

https://leetcode.cn/problems/er-cha-shu-de-jing-xiang-lcof/

不能在原来节点的基础上直接进行交换,要重新建立新的节点;而建立新的节点,不能前序进行建立,因为前序并不知道之后节点的情况,而翻转的创建的时候,应要包含子树;否则,子树并没有跟着根节点一起翻转;

 public TreeNode mirrorTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        TreeNode left = mirrorTree(root.left);
        TreeNode right = mirrorTree(root.right);
        root.left = right;
        root.right = left;
        return root;
    }
对称的二叉树

题解

 

class Solution {
    public boolean isSymmetric(TreeNode root) {
        return root == null ? true : recur(root.left, root.right);
    }
    boolean recur(TreeNode L, TreeNode R) {
        if(L == null && R == null) return true;
        if(L == null || R == null || L.val != R.val) return false;
        return recur(L.left, R.right) && recur(L.right, R.left);
    }
}

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/919680.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号