Java 练习 1.三角形最小路径和 2.外出采摘的日本人 3.最大矩形

4 篇文章 1 订阅

三角形最小路径和

给定一个三角形 triangle ,找出自顶向下的最小路径和。

每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 ii + 1

示例 1:

输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
输出:11
解释:如下面简图所示:
2
3 4
6 5 7
4 1 8 3
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。


示例 2:

输入:triangle = [[-10]]
输出:-10

在这里插入图片描述

进阶:

你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题吗?


import java.util.*;

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        int[] dp = new int[triangle.size()];
        int ans = 0;
        dp[0] = triangle.get(0).get(0);
        int temp, prev = 0, cur;
        for (int i = 1; i < triangle.size(); i++) {
            for (int j = 0; j < triangle.get(i).size(); j++) {
                temp = triangle.get(i).get(j);
                cur = dp[j];
                if (j == 0)
                    dp[j] = cur + temp;
                else if (j == triangle.get(i).size() - 1)
                    dp[j] = prev + temp;
                else
                    dp[j] = Math.min(prev, cur) + temp;
                prev = cur;
            }
        }
        for (int i = 1; i < dp.length; i++) {
            if (dp[ans] > dp[i])
                ans = i;
        }
        return dp[ans];
    }

    public static void main(String[] args) {
        List<List<Integer>> triangle = new ArrayList<List<Integer>>();

        List<Integer> list1 = new ArrayList<Integer>();
        list1.add(2);

        List<Integer> list2 = new ArrayList<Integer>();
        list2.add(3);
        list2.add(4);

        List<Integer> list3 = new ArrayList<Integer>();
        list3.add(6);
        list3.add(5);
        list3.add(7);

        List<Integer> list4 = new ArrayList<Integer>();
        list4.add(4);
        list4.add(1);
        list4.add(8);
        list4.add(3);

        triangle.add(list1);
        triangle.add(list2);
        triangle.add(list3);
        triangle.add(list4);

        Solution solution = new Solution();
        int total_min = solution.minimumTotal(triangle);
        System.out.println(total_min);
    }
}

外出采摘的日本人

二战后的某一天,N个日本人来到了一个山洞休息,为了派出一个日本人去外面充满危险的丛林中采摘食物,他们设置如下游戏产生外出采摘的人:

  • 1、首先,所有参加游戏的日本人按顺序编号为1、2、3…N;
  • 2、接下来每个日本人心里产生一个数字,这个数字称为序号为 N的人的密码P;
  • 3、所有参加游戏的人按照编号站成一个圈,长老为游戏设置初始密码K,从编号为 1的人开始报数,报到 K的人退出队伍,然后将自己心中的密码P说出来,由下一个人继续从 1开始报数,报到P的人退出队伍,以此类推;
  • 4、当队伍中剩下一个人的时候,这个人就是今天要出去采摘的日本人,他可能回不来了! 请各位同学设计程序并使用Java语言实现改程序,在用户输入了人数N、每个人的密码P和初始密码K的情况下,自动完成上面的选择过程,输出先后离开队伍的人的序号序列,最后输出要去采摘的日本人,输出他的编号。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class JosephCircle {
    public int newJoseph(int n, int[] p, int k) {
        List<Integer> num = new ArrayList<Integer>();
        for (int i = 0; i < n; i++)
            num.add(i);
        int t = k, index = 0;
        for (int i = 0; i < n - 1; i++) {
            index = (index + t) % num.size();
            num.remove(index);
            t = p[index];
            if (index == num.size())
                index = 0;
        }
        return num.get(0) + 1;
    }

    public int oldJoseph(int n, int k) {
        int w = 0;
        for (int i = 2; i <= n; i++) {
            w = (w + k) % i;
        }
        return w;
    }

    public static void main(String[] args) {
        JosephCircle jc = new JosephCircle();
        Scanner scan = new Scanner(System.in);
        int n, k;
        int[] p = new int[100];
        System.out.print("Enter N = ");
        n = scan.nextInt();
        System.out.print("Enter P[] = ");
        for (int i = 0; i < n; i++) {
            p[i] = scan.nextInt();
        }
        System.out.print("Enter K = ");
        k = scan.nextInt();
        System.out.println();
        System.out.println("Survivor is No." + jc.newJoseph(n, p, k));
    }
}

最大矩形

给定一个仅包含 01 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

示例 1:

在这里插入图片描述

输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]
输出:6
解释:最大矩形如上图所示。

示例 2:
输入:matrix = []
输出:0

示例 3:
输入:matrix = [[“0”]]
输出:0

示例 4:
输入:matrix = [[“1”]]
输出:1

示例 5:
输入:matrix = [[“0”,“0”]]
输出:0

提示:

rows == matrix.length
cols == matrix[0].length
0 <= row, cols <= 200
matrix[i][j]'0''1'

以下程序实现了这一功能:

import java.util.Arrays;

class Solution {
    public int maximalRectangle(char[][] matrix) {
        if (matrix == null || matrix.length == 0)
            return 0;
        int m = matrix.length;
        int n = matrix[0].length;
        int[] left = new int[n];
        int[] right = new int[n];
        int[] height = new int[n];
        Arrays.fill(right, n);
        int cur_left = 0;
        int cur_right = n;
        int res = 0;
        for (int i = 0; i < m; i++) {
            cur_left = 0;
            cur_right = n;
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == '1')
                    height[j]++;
                else
                    height[j] = 0;
            }
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == '1') {
                    left[j] = Math.max(left[j], cur_left);
                } else {
                    left[j] = 0;
                    cur_left = j + 1;
                }
            }
            for (int j = n - 1; j >= 0; j--) {
                if (matrix[i][j] == '1') {
                    right[j] = Math.min(right[j], cur_right);
                } else {
                    right[j] = n;
                    cur_right = j;
                }
            }
            for (int j = 0; j < n; j++)
                res = Math.max(res, (right[j] - left[j]) * height[j]);
        }
        return res;
    }

    public static void main(String[] args) {
        char[][] matrix = new char[][]{
            {'1', '0', '1', '0', '0'}, 
            {'1', '0', '1', '1', '1'}, 
            {'1', '1', '1', '1', '1'}, 
            {'1', '0', '0', '1', '0'}
        };
        Solution solution = new Solution();
        int i = solution.maximalRectangle(matrix);
        System.out.println(i);

    }
}

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小泉映月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值