Java每日一练(20230514) 滑动窗、最大子序和、转罗马数字

news/2024/5/20 8:06:19 标签: java, leetcode, 算法, 滑动窗口, 分治

目录

1. 滑动窗口最大值  🌟🌟

2. 最大子序和  🌟

3. 整数转罗马数字  🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


1. 滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回滑动窗口中的最大值。

示例 1:

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置                最大值
---------------               -----
[1 3  -1] -3  5  3  6  7       3
1 [3  -1  -3] 5  3  6  7       3
1  3 [-1  -3  5] 3  6  7       5
1  3  -1 [-3  5  3] 6  7       5
1  3  -1  -3 [5  3  6] 7       6
1  3  -1  -3  5 [3  6  7]      7

示例 2:

输入:nums = [1], k = 1
输出:[1]

示例 3:

输入:nums = [1,-1], k = 1
输出:[1,-1]

示例 4:

输入:nums = [9,11], k = 2
输出:[11]

示例 5:

输入:nums = [4,-2], k = 2
输出:[4]

提示:

  • 1 <= nums.length <= 10^5
  • -10^4 <= nums[i] <= 10^4
  • 1 <= k <= nums.length

出处:

https://edu.csdn.net/practice/27810767

代码:

java">import java.util.*;
public class Solution5 {
    public static int[] maxSlidingWindow(int[] nums, int k) {
        if (nums == null || nums.length < 0 || k <= 0 || k == 1)
            return nums;
        PriorityQueue<Integer> queue = new PriorityQueue<>(k, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });
        int[] max = new int[nums.length - k + 1];
        for (int i = 0; i < nums.length; i++) {
            if (i < k - 1) {
                queue.add(nums[i]);
            } else if (i == k - 1) {
                queue.add(nums[i]);
                max[0] = queue.peek();
            } else {
                queue.remove(nums[i - k]);
                queue.add(nums[i]);
                max[i - k + 1] = queue.peek();
            }
        }
        return max;
    }
    public static void main(String[] args) {
        int[] nums = {1,3,-1,-3,5,3,6,7};
        System.out.println(Arrays.toString(maxSlidingWindow(nums, 3)));
    }
}

输出:

[3, 3, 5, 5, 6, 7]


2. 最大子序和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [0]
输出:0

示例 4:

输入:nums = [-1]
输出:-1

示例 5:

输入:nums = [-100000]
输出:-100000

提示:

  • 1 <= nums.length <= 3 * 10^4
  • -10^5 <= nums[i] <= 10^5

进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治 求解。

出处:

https://edu.csdn.net/practice/27810768

代码1:

java">import java.util.*;
public class maxSubArray {
    public static int maxSubArray(int[] nums) {
        int maxSum = nums[0];
        int curSum = 0;
        for (int n : nums) {
            curSum += n;
            if (curSum > maxSum) {
                maxSum = curSum;
            }
            if (curSum < 0) {
                curSum = 0;
            }
        }
        return maxSum;
    }
    public static void main(String[] args) {
        int[] nums = {-2,1,-3,4,-1,2,1,-5,4};
        System.out.println(maxSubArray(nums));
    }
}

代码2:

java">import java.util.*;
public class maxSubArray {
    public static int maxSubArray(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n];
        dp[0] = nums[0];
        int res = dp[0];
        for (int i = 1; i < n; i++) {
            dp[i] = Math.max(dp[i-1] + nums[i], nums[i]);
            res = Math.max(res, dp[i]);
        }
        return res;
    }
    public static void main(String[] args) {
        int[] nums = {-2,1,-3,4,-1,2,1,-5,4};
        System.out.println(maxSubArray(nums));
    }
}

代码3:

java">import java.util.*;
public class maxSubArray {
    public static int maxSubArray(int[] nums) {
        return maxSubArrayHelper(nums, 0, nums.length-1);
    }
    public static int maxSubArrayHelper(int[] nums, int left, int right) {
        if (left == right) {
            return nums[left];
        }
        int mid = left + (right-left)/2;
        int leftMax = maxSubArrayHelper(nums, left, mid);
        int rightMax = maxSubArrayHelper(nums, mid+1, right);
        int crossMax = crossMaxSubArray(nums, left, right, mid);
        return Math.max(leftMax, Math.max(rightMax, crossMax));
    }
    public static int crossMaxSubArray(int[] nums, int left, int right, int mid) {
        int leftMax = Integer.MIN_VALUE;
        int curSum = 0;
        for (int i = mid; i >= left; i--) {
            curSum += nums[i];
            leftMax = Math.max(leftMax, curSum);
        }
        int rightMax = Integer.MIN_VALUE;
        curSum = 0;
        for (int i = mid+1; i <= right; i++) {
            curSum += nums[i];
            rightMax = Math.max(rightMax, curSum);
        }
        return leftMax + rightMax;
    }
    public static void main(String[] args) {
        int[] nums = {-2,1,-3,4,-1,2,1,-5,4};
        System.out.println(maxSubArray(nums));
    }
}

输出:

6


3. 整数转罗马数字

罗马数字包含以下七种字符: I, V, X, LCD 和 M

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给你一个整数,将其转为罗马数字。

示例 1:

输入: num = 3

输出: "III"

示例 2:

输入: num = 4

输出: "IV"

示例 3:

输入: num = 9

输出: "IX"

示例 4:

输入: num = 58

输出: "LVIII"

解释: L = 50, V = 5, III = 3.

示例 5:

输入: num = 1994

输出: "MCMXCIV"

解释: M = 1000, CM = 900, XC = 90, IV = 4.

提示:

  • 1 <= num <= 3999

出处:

https://edu.csdn.net/practice/27810769

代码:

java">import java.util.*;
public class Solution {
    public static String intToRoman(int num) {
        int f = 1000;
        int f2 = 1000;
        char[] sym = new char[] { 'M', 'D', 'C', 'L', 'X', 'V', 'I' };
        int fsi = 0;
        int[] s = new int[] { 2, 5 };
        int si = 0;
        int[] s2 = new int[] { 10, 1 };
        int si2 = 0;
        StringBuilder roman = new StringBuilder();
        while (num > 0) {
            int d = (int) Math.floor(num / f);
            int r = num % f;
            int d2 = (int) Math.floor(num / f2);
            int r2 = num % f2;
            if (d > 0) {
                if (d == 4) {
                    roman.append(sym[fsi]);
                    roman.append(sym[fsi - 1]);
                    num = r;
                } else if (d2 == 9) {
                    roman.append(sym[fsi + 1]);
                    roman.append(sym[fsi - 1]);
                    num = r2;
                } else {
                    for (int i = 0; i < d; i++) {
                        roman.append(sym[fsi]);
                    }
                    num = r;
                }
            }
            f = f / s[si];
            si++;
            si %= 2;
            f2 = f2 / s2[si2];
            si2++;
            si2 %= 2;
            fsi++;
        }
        return roman.toString();
    }
    public static void main(String[] args) {
        System.out.println(intToRoman(3));
        System.out.println(intToRoman(4));
        System.out.println(intToRoman(9));
        System.out.println(intToRoman(58));
        System.out.println(intToRoman(1994));
    }
}

输出:

III
IV
IX
LVIII
MCMXCIV


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/ 

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


http://www.niftyadmin.cn/n/319516.html

相关文章

Jsp基于WEB操作系统课程教学网站的设计与实现(源代码+论文)

通过操作系统教学网站的建设&#xff0c;完成了对于操作系统课程的远程化授课。可以使学生不受时间空间的限制&#xff0c;通过网络对于这门课程进行学习。建立起了基于B/C的网络化教学系统。本网站采用当前最流行的JSP网络编程技术&#xff0c;可以实现数据的高效、动态、交互…

大数据Doris(十九):Doris索引介绍与前缀索引

文章目录 Doris索引介绍与前缀索引 一、Doris索引介绍 二、前缀索引 Doris索引介绍与前缀索引 一、Doris索引介绍 索引用于帮助快速过滤或查找数据。目前 Doris 主要支持两类索引: 内建的智能索引,包括前缀索引和 ZoneMap

SQL 常用函数总结(一)

聚合函数 1. COUNT() COUNT() 函数用于计算一个表格或查询结果集合中的行数。 语法&#xff1a;COUNT(column_name) 或 COUNT(*) column_name 是可选的&#xff0c;表示计算某一列的非空值数量。* 表示计算所有行的数量。 示例1&#xff1a;计算 users 表格中所有记录的数…

SpringBoot——默认页面在哪里?

简单介绍&#xff1a; 在之前我们创建了一个SpringBoot的应用程序&#xff0c;并且我们也启动了&#xff0c;但是我们都是在postman或者是在控制台看到了我们的界面&#xff0c;那么在浏览器中看到的界面其实只有一个&#xff1a; 这个界面其实就是SpringBoot的报错默认界面&a…

MySQL的事务

1、事务的概念 事务是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这一组数据库命令要么都执行&#xff0c;要么都不执行。 事务是一个不可分割的工作逻辑单元&#xff…

为什么用对数收益率,而不是算数收益率 --因为可加性

核心就是对于单一投资品的收益率&#xff0c;对数收益率时序可加&#xff1b;对于不同投资品的截面收益率&#xff0c;应该用百分比收益率&#xff0c;因为它在截面上有可加性&#xff1b;另外对数收益率对建模有帮助。 如果我们考察单一投资品在总共 T 期内的表现&#xff0c;…

指令流和数据流

指令流和数据流 Flynn于1972年提出计算平台分类法主要根据指令流和数据流来分类&#xff0c;分为四类&#xff1a; ①单指令流单数据流机器&#xff08;S1SD) SISD机器是一种传统的串行计算机&#xff0c;它的硬件不支持任何形式的并行计算&#xff0c;所有的指令都是串行执…

【华为OD机试python】AI处理器组合【2023 Q1|100分】

华为OD机试- 题目列表 2023Q1 点这里!! 2023华为OD机试-刷题指南 点这里!! 题目描述 某公司研发了一款高性能AI处理器。 每台物理设备具备8颗AI处理器, 编号分别为0、1、2、3、4、5、6、7。 编号0-3的处理器处于同一个链路中, 编号4-7的处理器处于另外一个链路中, 不…