leetcode44——奇偶链表,验证前序二叉树,递增三元子序列

本文介绍了如何解决LeetCode上的328题(奇偶链表)和331题(验证前序序列化二叉树)。针对奇偶链表问题,提供了原地算法实现,通过迭代将奇数节点和偶数节点分开。对于验证前序序列化二叉树,给出了两种解决方案,一种使用栈,另一种从后往前遍历。同时,还涉及了334题(递增三元子序列)的解决方案,给出了一种O(n)时间复杂度和O(1)空间复杂度的算法。
摘要由CSDN通过智能技术生成

328:
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
示例 1:
输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL
示例 2:
输入: 2->1->3->5->6->4->7->NULL
输出: 2->3->6->7->1->5->4->NULL

public class Solution {
public ListNode oddEvenList(ListNode head) {
if (head == null) return null;
ListNode odd = head, even = head.next, evenHead = even;
while (even != null && even.next != null) {
odd.next = even.next;
odd = odd.next;
even.next = odd.next;
even = even.next;
}
odd.next = evenHead;
return head;
}
}

331:
序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如


例如,上面的二叉树可以被序列化为字符串 “9,3,4,#,#,1,#,#,2,#,6,#,#”,其中 # 代表一个空节点。
给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。
每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 ‘#’ 。
你可以认为输入格式总是有效的,例如它永远不会包含两个连续的逗号,比如 “1,3” 。
示例 1:
输入: “9,3,4,#,#,1,#,#,2,#,6,#,#”
输出: true
方法一:利用栈

class Solution {
public boolean isValidSerialization(String preorder) {
Stack stack=new Stack();
String[] strs = preorder.split(",");
stack.push(1);
for(int i=0;i<strs.length;i++){
if(stack.isEmpty())return false;
int value=stack.pop();
if(++value!=2)stack.push(value);
if(!strs[i].equals("#"))stack.push(0);
}
return stack.isEmpty();
}
}
方法二:
不需要栈,从后往前遍历,用num记录#的个数,当遇到正常节点时,#的个数-2,并将该节点转化成#,num+1,,整体即为num-1; 当出现num=0时,即false,最终也须保证num为1。
注意,如果验证后序遍历,只需要从前往后即可,方法同样有效
class Solution {
public boolean isValidSerialization(String preorder) {
int count=0;
String[] strs = preorder.split(",");
for(int i=strs.length-1;i>=0;i–){
if(strs[i].equals("#"))count++;
else count–;
if(count0)return false;
}
return count
1;
}
}

334:
给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。
数学表达式如下:
如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1,
使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。
说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1) 。
示例 1:
输入: [1,2,3,4,5]
输出: true
示例 2:
输入: [5,4,3,2,1]
输出: false
class Solution {
public boolean increasingTriplet(int[] nums) {
int index1=Integer.MAX_VALUE,index2=Integer.MAX_VALUE;
for(int i=0;i<nums.length;i++){
if(nums[i]<index1){
index1=nums[i];
}
else if(nums[i]>index1&&nums[i]<index2){
index2=nums[i];
}
else if(nums[i]>index2)return true;
}
return false;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值