leetcode 238 & leetcode 152 & leetcode 228
lc238 Product of Array Except Self
遍历两次数组 用一个res[] 记录答案
1) 第一次,从左往右遍历 res[i] 记录0~i-1的乘积
2) 第二次,从右往左遍历 res[i] *= right right *= nums[i]
注意两者顺序,right初值为1,更新步骤一定要在res[i]乘完之后,因为res *= right的目的是补上i+1~j这一部分的乘积,而不是i~j。
class Solution {
public int[] productExceptSelf(int[] nums) {
if(nums == null || nums.length < 2)
return nums; int len = nums.length;
int[] res = new int[len];
res[0] = 1; for(int i=1; i<len; i++){
res[i] = res[i-1] * nums[i-1];
}
int right = 1; for(int i=len-1; i>=0; i--){
res[i] *= right;
right *= nums[i];
} return res;
}
}
lc152 Maximum Product Subarray
本质上还是一个dp,dp[i] = Math.max(dp[i-1]*i, i),然后用一个res记录所有dp里的最大值。
不过因为是乘法所以要考虑正负性的问题,可能负负得正,min乘完i反而是max
有两种解决方案
1) 记录每次i的max和min乘积,若nums[i] 为负,则交换max和min,因为max*nums[i] 肯定为负,不如试一试min*nums[i]。
intuitive是min其实记录的yes负数里的“最大值“ (例如-982 < -32 --> 982 > 32),此时我们只要乘以一个负数,min*i有可能是最大值
class Solution {
public int maxProduct(int[] nums) {
if(nums == null || nums.length == 0)
return 0;
int len = nums.length;
int res = nums[0]; int max = res, min = res; for(int i=1; i<len; ++i){
if(nums[i] < 0){
int tmp = max;
max = min;
min = tmp;
} max = Math.max(nums[i], max*nums[i]);
min = Math.min(nums[i], min*nums[i]); res = Math.max(res, max);
} return res; }
2) 在写max和min更新方程的时候,考虑正负性,1)中分析了,min*i可能是最大值,同理max*i也可能是最小值,所以我们的更新方程应该写成:
max = Math.max(nums[i], Math.max(max*nums[i]), min*nums[i]);
min = Math.min(nums[i], Math.min(min*nums[i], man*nums[i]));
lc228 Summary Ranges
1) 观察这个数组,由于是有序且不重复的,这些差值为1的元素,他们与index的差值也是相同的 index: 0 1 2 3 4 5 6 nums: 2 4 5 7 8 9 12 差值: 2 3 3 4 4 4 6 我们可以通过这个规律来解决这个问题
2) 另一种更直观的想法就是:检查nums[i+1] – nums[i]是否 == 1 一个for循环,里面套一个while, while里面判断i+1和i的差值是否为1,为1就i++,否则停止
若更新了,那么原来的nums[i]肯定与现在的不同,所以我们for里第一句用一个tmp存储原来的nums[i] while之后,
若tmp != nums[i],说明tmp ~ nums[i]之间有多个连续的元素,为什么能肯定是多个?因为while的判断条件,没有多个,i不变,tmp == nums[i],然后for进行下一次循环。
若tmp == nums[i], 说明tmp这个元素单独成一组
class Solution {
public List<String> summaryRanges(int[] nums) {
if(nums == null || nums.length == 0){
List<String> res = new ArrayList<>();
return res;
}
int len = nums.length;
List<String> res = new ArrayList<>(); if(len == 1){
res.add(nums[0] + "");
return res;
} for(int i=0; i<len; i++){
int tmp = nums[i];
while(i+1 < len && nums[i+1] - nums[i] == 1){
i++;
}
if(tmp != nums[i]){
res.add(tmp+"->"+nums[i]);
}else
res.add(tmp+""); } return res; }
}
leetcode 238 & leetcode 152 & leetcode 228的更多相关文章
- LeetCode:汇总区间【228】
LeetCode:汇总区间[228] 题目描述 给定一个无重复元素的有序整数数组,返回数组区间范围的汇总. 示例 1: 输入: [0,1,2,4,5,7] 输出: ["0->2&quo ...
- 剑指offer 66. 构建乘积数组(Leetcode 238. Product of Array Except Self)
剑指offer 66. 构建乘积数组 题目: 给定一个数组A[0, 1, ..., n-1],请构建一个数组B[0, 1, ..., n-1],其中B中的元素B[i] = A[0] * A[1] * ...
- LeetCode 238. Product of Array Except Self (去除自己的数组之积)
Given an array of n integers where n > 1, nums, return an array output such that output[i] is equ ...
- LeetCode 刷题 App / LeetCode 题解 App
LeetCode 刷题 APP / LeetCode 题解 App 全端支持 http://leetcode-app.xgqfrms.xyz/ http://leetcode-desktop.xgqf ...
- LeetCode 238. 除自身以外数组的乘积(Product of Array Except Self)
238. 除自身以外数组的乘积 238. Product of Array Except Self 题目描述 LeetCode LeetCode238. Product of Array Except ...
- [LeetCode] 238. Product of Array Except Self 除本身之外的数组之积
Given an array nums of n integers where n > 1, return an array output such that output[i] is equ ...
- Leetcode Weekly Contest 152
退役老人现在连leetcode都不会做了 = = 今天早上做了leetcode第三题题目看错了,加上比赛中间还在调投稿的实验,一心二用直接gg 总结下教训就是 本渣现在做题连题目都看不清就开始做.开始 ...
- LN : leetcode 238 Product of Array Except Self
lc 238 Product of Array Except Self 238 Product of Array Except Self Given an array of n integers wh ...
- LeetCode No.151,152,153
No.151 ReverseWords 翻转字符串里的单词 题目 给定一个字符串,逐个翻转字符串中的每个单词. 示例 输入: "the sky is blue" 输出: " ...
随机推荐
- pycharm中使用配置好的virtualenv环境,自动生成和安装requirements.txt依赖
1.手动建立: 第一步 建立虚拟环境 Windows cmd: pip install virtualenv 创建虚拟环境目录 env 激活虚拟环境 C:\Python27\Scripts\env\S ...
- 锁定文件失败 打不开磁盘“D:\vms\S1\CentOS 64 位.vmdk”或它所依赖的某个快照磁盘(强制关机后引起的问题)
电脑强制关机后,centos系统启动失败,报异常:锁定文件失败 打不开磁盘“D:\vms\S1\CentOS 64 位.vmdk”或它所依赖的某个快照磁盘.解决办法:进入D:\vms\S1目录,删除下 ...
- C#字符串、字节数组和内存流间的相互转换 - IT浪潮之巅
定义string变量为str,内存流变量为ms,比特数组为bt 1.字符串=>比特数组 (1)byte[] bt=System.Text.Encoding.Default.GetBytes(&q ...
- 利用bu命令下延迟断点
bu可以针对符号下断点.这里是用bu下延迟断点的意义在于即使目标驱动没有被加载,windbg也允许我们针对符号设置断点.当新加载驱动程序后,windbg就会检查驱动程序中是否包含了设置了延迟断点的函数 ...
- iOS开发之SceneKit框架--SCNView.h
1.SCNView 在macOS中,SCNView是NSView的子类,在iOS和tvOS中,SCNView是UIView的子类.SCNView用于显示SceneKit的3D场景,而需要设置场景的相关 ...
- 可拖拽排序的vue组件
最近在优化一个vue的博客系统,想实现文章列表处的文章拖拽功能.就试了一下awe-dnd vue插件,觉得还挺好用的. 安装 npm install awe-dnd --save 使用 在main.j ...
- 获取AndroidManifest.xml中的meta-data元素
android 开发中: 在AndroidManifest.xml中,<meta-data>元素可以作为子元素, 被包含在<activity>.<application& ...
- 16-3-es5解析顺序
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- LeetCode 19.删除链表的倒数第N个节点(Python)
题目: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点 ...
- 进程监控驱动 PsSetCreateProcessNotifyRoutine
函数原型: NTSTATUS PsSetCreateProcessNotifyRoutine( _In_ PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, _ ...