15. 三数之和 AND 98. 验证二叉搜索树

81 阅读1分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

15. 三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例 1:

输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]] 示例 2:

输入:nums = [] 输出:[] 示例 3:

输入:nums = [0] 输出:[]

解题思路

来自两数之和的思路,根据两数之和的算法,我们每次枚举nums的一个值nums[i],每次在[0...i-1]的子数组中找两数之和等于-nums[i]的二元组

代码

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res=new ArrayList<>();
        int n=nums.length;
        Arrays.sort(nums);
        for (int i=n-1;i>=2;i--)
        {
            int l=0,r=i-1,tar=-nums[i];
            if (i<n-1&&nums[i]==nums[i+1]) continue;
            while (l<r){
                if (nums[l]+nums[r]==tar)
                {
                    res.add(Arrays.asList(nums[l],nums[r],nums[i]));
                    while (l<r&&nums[l]==nums[l+1]) l++;
                    l++;
                    while (l<r&&nums[r]==nums[r-1]) r--;
                    r++;
                }else if(nums[l]+nums[r]<tar)
                {
                    l++;
                }else {
                    r--;
                }
            }
        }
        return res;

    }
}

98. 验证二叉搜索树

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。

  • 示例 1:
输入:
    2
   / \
  1   3

输出: true

  • 示例 2:

输入:

    5
   / \
  1   4
     / \
    3   6

输出: false 解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。

解题思路

  • 中序遍历的次序,就是二叉排序树的节点值从小到大遍历的次序
  • 因此我们可以维护一个变量记录前一个遍历的节点的值,当以中序遍历时,所有节点都是递增的,则证明是二叉排序树

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    Integer prep=null;
    public boolean isValidBST(TreeNode root) {
        if (root==null) return true;
        boolean l = isValidBST(root.left);
        if ((prep==null||root.val>prep)&&l)
            prep=root.val;
        else return false;
        return  isValidBST(root.right);
    }
}