一、Y总视频进度
二、AcWing 785. 快速排序
(1)题目描述
给定你一个长度为 nn 的整数数列。
请你使用快速排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 nn。
第二行包含 nn 个整数(所有整数均在 1∼1091∼109 范围内),表示整个数列。
输出格式
输出共一行,包含 nn 个整数,表示排好序的数列。
数据范围
1≤n≤1000001≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5
(2)问题分析
写一个快速排序,然后调用排序方法
(3)代码实现
s
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(reader.readLine());
int[] arr = new int[n];
String[] strs = reader.readLine().split(" ");
for(int i = 0; i < n; i++){
arr[i] = Integer.parseInt(strs[i]);
}
quick_sort(arr, 0, arr.length - 1);
for(int i = 0; i < arr.length; i++){
System.out.print(arr[i] + " ");
}
reader.close();
}
public static void quick_sort(int q[],int l,int r){
if(l>=r) return;
int i=l-1,j=r+1,x=q[l+r>>1];
while(i<j){
do i++; while(q[i]<x);
do j--; while(q[j]>x);
if(i<j){
int t=q[i];
q[i]=q[j];
q[j]=t;
}
}
quick_sort(q,l,j);quick_sort(q,j+1,r);
}
}
三、ACWing786. 第k个数
(1)题目描述
给定一个长度为 nn 的整数数列,以及一个整数 kk,请用快速选择算法求出数列从小到大排序后的第 kk 个数。
输入格式
第一行包含两个整数 nn 和 kk。
第二行包含 nn 个整数(所有整数均在 1∼1091∼109 范围内),表示整数数列。
输出格式
输出一个整数,表示数列的第 kk 小数。
数据范围
1≤n≤1000001≤n≤100000,
1≤k≤n1≤k≤n
输入样例:
5 3
2 4 1 5 3
输出样例:
3
(2)问题分析
快排之后返回第K个元素即可
(3)代码实现
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String[] strs = reader.readLine().split(" ");
int n = Integer.parseInt(strs[0]);
int k = Integer.parseInt(strs[1]);
int[] arr = new int[n];
strs = reader.readLine().split(" ");
for(int i = 0; i < n; i++){
arr[i] = Integer.parseInt(strs[i]);
}
int res = quickSort(arr, 0 , arr.length - 1, k);
System.out.println(res);
reader.close();
}
public static int quickSort(int[] arr, int start, int end, int k){
if(start >= end) return arr[start];
int stard = arr[start];
int low = start, high = end;
while(low < high){
while(low < high && stard <= arr[high]) high--;
arr[low] = arr[high];
while(low < high && stard >= arr[low]) low++;
arr[high] = arr[low];
}
arr[low] = stard;
int sl = high - start + 1;
if(k <= sl) return quickSort(arr, start, high, k);
return quickSort(arr, high + 1, end, k - sl);
}
}
四、LeetCode:931. 下降路径最小和
(1)题目描述
给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。
下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 。
示例 1:
输入:matrix = [[2,1,3],[6,5,4],[7,8,9]]
输出:13
解释:下面是两条和最小的下降路径,用加粗+斜体标注:
[[2,1,3], [[2,1,3],
[6,5,4], [6,5,4],
[7,8,9]] [7,8,9]]
示例 2:
输入:matrix = [[-19,57],[-40,-5]]
输出:-59
解释:下面是一条和最小的下降路径,用加粗+斜体标注:
[[-19,57],
[-40,-5]]
示例 3:
输入:matrix = [[-48]]
输出:-48
提示:
n == matrix.length
n == matrix[i].length
1 <= n <= 100
-100 <= matrix[i][j] <= 100
(2)问题分析
读题可知这道题用动态规划来求解,因为动态规划的方程已经给出来了,但是这里我们要注意,一个路径可以从以上三个路径((row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1))中得到,所以我们要注意边界问题,所以这道题我们要从后边往前面推导.
(3)代码实现
class Solution{
public int minFallingPathSum(int[][] A){
int N=A.length;
for(int r=N-2;r>=0;r--){
for(int c=0;c<N;c++){
int best=A[r+1][c];
if(c>0) best=Math.min(best,A[r+1][c-1]);
if(c+1<N) best=Math.min(best,A[r+1][c+1]);
A[r][c]+=best;
}
}
int ans=Integer.MAX_VALUE;
for(int x:A[0])
ans=Math.min(ans,x);
return ans;
}
}