今日题目
1、寻找数组中第K大的数
import java.util.*;
public class Finder {
public int findKth(int[] a, int n, int K) {
// write code here
quickSort(a,0,n-1,K);
return a[K-1];
}
public void quickSort(int[] arr,int start,int end,int k){
if(arr==null||start>=end) return;
int i=start,j=end;
int temp=arr[start];
//注意是从大到小的快排
while(i<j){
while(i<j&&arr[j]<=temp) j--;//从右边开始
if(i<j) arr[i++]=arr[j];
while(i<j&&arr[i]>=temp) i++;
if(i<j) arr[j--]=arr[i];
}
arr[i]=temp;
if(i+1==k){
return;
}else if(i+1>k){
quickSort(arr,start,i-1,k);//对两侧分别递归排序
}else{
quickSort(arr,i+1,end,k);
}
}
}
2、合并有序链表
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param l1 ListNode类
* @param l2 ListNode类
* @return ListNode类
*/
public ListNode mergeTwoLists (ListNode l1, ListNode l2) {
// write code here
ListNode dummy=new ListNode(0);
ListNode curr=dummy;
while(l1!=null&&l2!=null){
if(l1.val<l2.val){
curr.next=l1;
l1=l1.next;
}else{
curr.next=l2;
l2=l2.next;
}
curr=curr.next;
}
if(l1==null) curr.next=l2;
if(l2==null) curr.next=l1;
return dummy.next;
}
}
3、最小的K个数
方法1:使用PriorityQueue当作Heap,每次返回最大的值。
import java.util.*;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
//建立大根堆
ArrayList<Integer> res=new ArrayList<>();
int length=input.length;
if(k>length||k==0){
return res;
}
PriorityQueue<Integer> maxHeap =new PriorityQueue<>(k,Collections.reverseOrder());
for(int i=0;i<length;i++){
if(maxHeap.size()<k){
maxHeap.add(input[i]);
}else{
if(input[i]<maxHeap.peek()){
maxHeap.remove();
maxHeap.add((input[i]));
}
}
}
while(!maxHeap.isEmpty()){
res.add(maxHeap.remove());
}
return res;
}
}
方法2、使用快排
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> res = new ArrayList<>();
if(k > input.length){
return res;
}
quickSort(input, 0, input.length - 1, k);
for(int i = 0; i < k; i++){
res.add(input[i]);
}
return res;
}
public void quickSort(int[] arr,int start,int end,int k){
if(arr==null||start>=end) return;
int i=start,j=end;
int temp=arr[start];
while(i<j){
while(i<j&&arr[j]>=temp) j--;//从右边开始
if(i<j) arr[i++]=arr[j];
while(i<j&&arr[i]<=temp) i++;
if(i<j) arr[j--]=arr[i];
}
arr[i]=temp;
if(i==k){
return;
}
quickSort(arr,start,i-1,k);//对两侧分别递归排序
quickSort(arr,i+1,end,k);
}
}
4、二叉树的层序遍历
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @return int整型ArrayList<ArrayList<>>
*/
public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
// write code here
ArrayList<ArrayList<Integer>> res=new ArrayList<>();
Queue<TreeNode> queue=new ArrayDeque<>();
if(root==null){
return res;
}
queue.add(root);
while(!queue.isEmpty()){
int size=queue.size();
ArrayList<Integer> list =new ArrayList<>();
for(int i=0;i<size;i++){
TreeNode node=queue.poll();
list.add(node.val);
if(node.left!=null) queue.add(node.left);
if(node.right!=null) queue.add(node.right);
}
res.add(list);
}
return res;
}
}
5、跳台阶
public class Solution {
public int JumpFloor(int target) {
if(target<2){
return target;
}
int[] dp=new int[target+1];
dp[1]=1;
dp[2]=2;
for(int i=3;i<target+1;i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[target];
}
}