1. 乘积最大子数组
给你一个整数数组 nums
,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
出处:
https://edu.csdn.net/practice/26466594
代码:
import java.util.*; public class maxProduct { public static class Solution { public int maxProduct(int[] nums) { int max = Integer.MIN_VALUE, imax = 1, imin = 1; for (int i = 0; i < nums.length; i++) { if (nums[i] < 0) { int tmp = imax; imax = imin; imin = tmp; } imax = Math.max(imax * nums[i], nums[i]); imin = Math.min(imin * nums[i], nums[i]); max = Math.max(max, imax); } return max; } } public static void main(String[] args) { Solution s = new Solution(); int[] nums = {2,3,-2,4}; System.out.println(s.maxProduct(nums)); int[] nums2 = {-2,0,-1}; System.out.println(s.maxProduct(nums2)); } }
输出:
6
0
2. 插入区间
给你一个 无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 1:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]
示例 2:
输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
示例 3:
输入:intervals = [], newInterval = [5,7]
输出:[[5,7]]
示例 4:
输入:intervals = [[1,5]], newInterval = [2,3]
输出:[[1,5]]
示例 5:
输入:intervals = [[1,5]], newInterval = [2,7]
输出:[[1,7]]
提示:
0 <= intervals.length <= 10^4
intervals[i].length == 2
0 <= intervals[i][0] <= intervals[i][1] <= 10^5
intervals
根据intervals[i][0]
按 升序 排列newInterval.length == 2
0 <= newInterval[0] <= newInterval[1] <= 10^5
出处:
https://edu.csdn.net/practice/26466595
代码:
import java.util.*; public class insertIntervals { public static class Solution { public int[][] insertIntervals(int[][] intervals, int[] newInterval) { int[][] newIntervals = new int[intervals.length + 1][]; System.arraycopy(intervals, 0, newIntervals, 0, intervals.length); newIntervals[intervals.length] = newInterval; Arrays.sort(newIntervals, (a, b) -> a[0] - b[0]); Stack<int[]> stack = new Stack<>(); for (int[] num : newIntervals) { if (stack.isEmpty()) { stack.push(num); continue; } int[] arr = stack.peek(); if (arr[1] >= num[0]) { int[] combine = { arr[0], Math.max(arr[1], num[1]) }; stack.pop(); stack.push(combine); } else { stack.push(num); } } return stack.toArray(new int[0][]); } } public static String ArrayToString(int[] arr) { String res = "["; for (int i = 0; i < arr.length; ++i) { res += String.valueOf(arr[i]); if (i+1 < arr.length) { res += ","; } } return res + "]"; } public static void printArray2D(int[][] arr) { System.out.print("["); for (int i = 0; i < arr.length; ++i) { System.out.print(ArrayToString(arr[i])); if (i+1 < arr.length) { System.out.print(","); } } System.out.println("]"); } public static void main(String[] args) { Solution s = new Solution(); int[][] intervals = {{1,3},{6,9}}; int[] newInterval = {2,5}; printArray2D(s.insertIntervals(intervals,newInterval)); int[][] intervals2 = {{1,2},{3,5},{6,7},{8,10},{12,16}}; int[] newInterval2 = {4,8}; printArray2D(s.insertIntervals(intervals2,newInterval2)); } }
输出:
[[1,5],[6,9]]
[[1,2],[3,10],[12,16]]
3. 删除有序数组中的重复项 II
给你一个有序数组 nums
,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝 int len = removeDuplicates(nums);// 在函数里修改输入数组对于调用者是可见的。 // 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。 for (int i = 0; i < len; i++) { print(nums[i]); }
示例 1:
输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2,3 。 不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,0,1,1,1,1,2,3,3]
输出:7, nums = [0,0,1,1,2,3,3]
解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。 不需要考虑数组中超出新长度后面的元素。
提示:
1 <= nums.length <= 3 * 10^4
-10^4 <= nums[i] <= 10^4
nums
已按升序排列
出处:
https://edu.csdn.net/practice/26466596
代码:
import java.util.*; public class removeDuplicatesII { public static class Solution { public int removeDuplicates(int[] nums) { int i = 0; for (int n : nums) if (i < 2 || n > nums[i - 2]) nums[i++] = n; return i; } } public static void main(String[] args) { Solution s = new Solution(); int[] nums = {1,1,1,2,2,3}; System.out.println(s.removeDuplicates(nums)); int[] nums2 = {0,0,1,1,1,1,2,3,3}; System.out.println(s.removeDuplicates(nums2)); } }
输出:
5
7
🌟 每日一练刷题专栏 🌟
✨持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
🌟 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!
☸ 主页:https://hannyang.blog.csdn.net/