剑指offer笔记

3 篇文章 0 订阅
3 篇文章 0 订阅

27.二叉搜索树与双向链表

    递归:使用中序遍历,找到最左边的节点(即最小的节点,作为节点头)作为当前头节点,返回,上一节作为当前节点,当前节点指向头节点,头节点也指向当前节点,当前节点作为头节点;递归到右子树最大节点。

    循环:使用中序遍历的非递归方法,在第二层循环外调整两个节点相互指向,最后返回第一个节点。

30.栈最小数min函数

    引入辅助栈,第一个数入两栈,其余数比较辅助栈的栈顶元素大小,较小入辅助栈。因此辅助栈栈顶总是栈中最小元素。

31.栈的压入和弹出序列

    思路1:弹出序列的第一个数字,确定之前需要压入的数字,即在压入队列中的第一个弹出的数字及之前的数字都需要被压入,然后根据弹出序列;根据出栈序列,元素在栈顶,则直接出栈,不在栈顶,压入再出栈,在栈中且不在栈顶,则不符合要求。

    思路2:弹出序列第一个数字出现之前,压入栈连续入辅助栈,直到辅助栈顶等于第一个数字,辅助栈出栈,循环判断栈顶是否等于下一个弹出数,直到所有压入栈顶数字都压入辅助栈。辅助栈空,则符合,非空,则不符合。

32.从上到下打印二叉树

    打印根节点,子树入队列,队列非空,出队打印,子树入队列,循环。

33.二叉搜索树大后续遍历序列

    序列最后一个数字为根,比根小的为左树,比根大的为右树,如果右子树有小于根的,则返回false,递归判断子树。

34.二叉树路径

    从上到下,压入节点值,符合要求,则加入结果中,不符合则返回,并删除当前节点。

35.复杂链表复制

    先复制顺序链表。

    思路1:用hashmao存储原节点和新节点,原节点random指向哪个,新节点的random也指向hashmap.get(原节点.random)

 

扑克牌顺子数

1)排序;2)遍历排序后的数组;3)是癞子,癞子数+1,continue;4)不是癞子,比较当前数和下一个数的差,用癞子填补,癞子减少;5)遍历结束,癞子是否为>=0则牌为顺子。

public static boolean Solution(int[] numbers) {
		if (numbers==null) {
			return false;
		}
		if (numbers.length!=5) {
			return false;
		}
		Arrays.sort(numbers);
		int numsOfZero = 0;
		for(int i = 0; i < numbers.length-1; i++) {
			if (numbers[i] == 0) {
				numsOfZero++;
				continue;
			}
			if (numbers[i] == numbers[i+1]) {
				return false;
			}
			numsOfZero -= numbers[i+1] - numbers[i] - 1;
		}
		return numsOfZero >= 0;
	}

滑动窗口最大数

两种解法:最大堆和双端队列

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;

public class MaxValueOfSlideWindow {
	public static void main(String[] args) {
		int[] nums = {3,5,6,2,1,2,3,4,5,6,7,9};
		System.out.println(MaxInWindows(nums, 3));
		System.out.println(MaxInWindows2(nums, 3));
	}
	public static ArrayList<Integer> MaxInWindows(int [] num, int size){
		ArrayList<Integer> res = new ArrayList<>();
		if (num==null||size<=0||num.length<size) {
			return res;
		}
		PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(size, new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				// TODO Auto-generated method stub
				return o2-o1;
			}
		});
		for(int i = 0; i < size; i++) {
			priorityQueue.add(num[i]);
		}
		res.add(priorityQueue.peek());
		for(int i  = 0, j = size + i; j < num.length; i++, j++) {
			priorityQueue.add(num[j]);
			priorityQueue.remove(num[i]);
			res.add(priorityQueue.peek());
		}
		return res;
	}
	
	public static ArrayList<Integer> MaxInWindows2(int [] num, int size){
		ArrayList<Integer> res = new ArrayList<>();
		if (num==null||size<=0||num.length<size) {
			return res;
		}
		int begin;
		ArrayDeque<Integer> windows = new ArrayDeque<>();
		for(int i = 0; i < num.length; i++) {
			begin = i + 1 - size;
			if (windows.isEmpty()) {
				windows.add(i);
			}
			else if(begin > windows.peekFirst()) {
				windows.pollFirst();
			}
			while(!windows.isEmpty()&&num[windows.peekLast()]<=num[i]) {
				windows.pollLast();
			}
			windows.add(i);
			if (begin >= 0 ) {
				res.add(num[windows.peekFirst()]);
			}
		}
		return res;
	}
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值