这是我参与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);
}
}