数组
* 寻找数组中第二小的元素
priorityQueue 堆
1.排序
1 | public static int findKthLargest(int[] nums, int k) { |
时间复杂度为O(nlog(n))。
2.通过堆
1 | public static int findKthLargest(int[] nums, int k) { |
时间复杂度为O(nlog(k)),空间复杂度为 O(k) 。
3.快排
若k在基准左边,则在左边快排序,否则在右边快排
1 | public static int findKthLargest(int[] nums, int k) { |
平均时间复杂度为O(n),最坏情况下为O(n^2)。
——————————- 本文来自 -似曾相识燕归来 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/hzh_csdn/article/details/53446211?utm_source=copy
* 找到数组中第一个不重复出现的整数
合并两个有序数组
重新排列数组中的正值和负值
栈
使用栈计算后缀表达式
逆波兰式:
(a+b)*c-(a+b)/e的后缀表达式为:ab+c*ab+e/-
对栈的元素进行排序
原栈:s1,准备一个辅助栈s2
- s1第一次出栈,不进行比较,直接放到s2
- 当s1非空,每次从s1弹出a,将s2中顺序不符的值都弹回s1
- 将a压入s2
- 刚才弹回s1的值都弹回到s2
- 若s1空则完成了排序。
判断表达式是否括号平衡
使用栈实现队列
队列
使用队列表示栈
假设有个一串数字a,b,c,d顺序入栈,出来的结果应该是d,c,b,a,有两个队列Q1,Q2,
第一步:随便找一个空的队列Q1,将a放入到Q1,此时Q2中数据为空,Q1里面有a。
第二步:找到空的队列Q2,将b放入,并将 Q1里面的值(a)全部输出,加入到Q2中,此时Q1为空,Q2里面有b,a。
第三步:将c放入到空的队列Q1中,将Q2里面的值(b,a)全部输出,放入到Q1中,此时Q2里面值为空,Q1里面有c,b,a。
……
不断循环就可以用两个队列实现一个栈的功能
对队列的前k个元素倒序
使用队列生成从1到n的二进制数
链表
链表反转
检测链表的环
快慢指针:
1 | /** |
https://blog.csdn.net/u010983881/article/details/78896293
返回链表倒数的第N个节点
创建两个指向head的指针p q,让p遍历,p先开始移动,p走到第n-1个节点后,p q 一起往后移动