2022-01-06每日刷题打卡

一、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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值