热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

leetCode解题报告5道题(十一)

题目一:SubsetsGivenasetofdistinctintegers,S,returnallpossiblesubsets.Note:Elementsinasubse

题目一:Subsets

Given a set of distinct integers, S, return all possible subsets.

Note:

  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

For example,
If S = [1,2,3], a solution is:

[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]

分析:

题目的题意挺简单的,我就不做说明,主要这道题目可以用递归的方法来做,也可以直接用迭代来取代,我们用迭代的方式来做这道题目,没有什么特别的算法,直接上代码,代码里有注释哈!


AC代码:

public class Solution {
private ArrayList> results = new ArrayList>();
public ArrayList> subsets(int[] S) {
int len = S.length;
results.add(new ArrayList()); //先增加一个 [] 空集
int size = results.size();
int nowDealCount = 0; //表示当前要处理的长度
while (nowDealCount != len){
for (int i=0; i ArrayList nowList = (ArrayList)results.get(i);
if (nowDealCount == 0){//如果处理的长度为0,表示是最开始只有一个 空集 的时候
for (int j=0; j ArrayList addList = new ArrayList();
addList.add(S[j]);
results.add(addList);
}
}else if (nowList != null && nowList.size() == nowDealCount){
int maxNum = (int)nowList.get(nowDealCount-1);
for (int j=0; j if (maxNum ArrayList copyList = new ArrayList(nowList);
copyList.add(S[j]);
results.add(copyList);
}
}
}
}
size = results.size();
nowDealCount++;
}

return results;
}
}

目二:Subsets II

Given a collection of integers that might contain duplicates, S, return all possible subsets.

Note:

  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

For example,
If S = [1,2,2], a solution is:

[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]

分析:

这道题目跟上面那道基本上思路是类似的,只是这道题目多了可能重复的元素,这时候我们就要考虑重复的元素不能有相同集合的问题了,先把Num[]数组进行排序,然后跟题目一一样的解法, 只是在此过程中我们需要知道每个添加到results中的集合的最后一个元素(即最大元素)的下标,我们用一个indexList来存储。

这样的话每次要再添加新元素组成新的集合,就只要从下标位置+1开始,到len结束来搜索就行了。但要注意的是,如果当前要添加到集合中的元素和前一个元素相等,那么就不添加,如 : [1, 2, 2], 当我们处理到nowDealCount==1时

要往 [1] 中添加元素,我们会添加一个 [2], 组成[1, 2]但是当到第二个[2]的时候,我们不能再添加一个[1, 2]了,否则就重复出现了!


AC代码:

public class Solution {
private ArrayList> results = new ArrayList>();
public ArrayList> subsets(int[] S) {
int len = S.length;
results.add(new ArrayList()); //先增加一个 [] 空集
int size = results.size();
int nowDealCount = 0; //表示当前要处理的长度
while (nowDealCount != len){
for (int i=0; i ArrayList nowList = (ArrayList)results.get(i);
if (nowDealCount == 0){//如果处理的长度为0,表示是最开始只有一个 空集 的时候
for (int j=0; j ArrayList addList = new ArrayList();
addList.add(S[j]);
results.add(addList);
}
}else if (nowList != null && nowList.size() == nowDealCount){
int maxNum = (int)nowList.get(nowDealCount-1);
for (int j=0; j if (maxNum ArrayList copyList = new ArrayList(nowList);
copyList.add(S[j]);
results.add(copyList);
}
}
}
}
size = results.size();
nowDealCount++;
}

return results;
}
}


题目三:Unique Paths

A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).

The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).

How many possible unique paths are there?

Note: m and n will be at most 100.

分析:

题目的意思从一个矩阵的左上角的位置开始走,只能向右走或者向下走,最后要走到矩阵的右下角,求解出一共有多少种不同的走法.

我们拿一个示例来分析下,当m=3, n=7的时候

一个3 * 7的矩阵


比如现在我们要求从 start(0,0)开始走到finish的方法数,但是start的位置的走法只有两种向右或者向下,这样的话相当于问题被转换成了求解 (0+1, 0)位置达到终点的走法 + (0, 0+1)位置达到终点的走法 [其实就是一个递归的过程]。明白了这样之后,我们用递归来求解一下,发现直接TLE了。这样很明显我们需要自底向上,从 (m-2, n-2)的位置开始往前推,最后推到 (0, 0)的时候,就是我们要的结果值了。

设ways[row][col]表示 位置(row, col)到达终点(m-1, n-1) 的不同路径的条数,那么很容易得到下面的式子


ways[m-1][col] = 1; ( 0 <= col

ways[row][n-1] = 1; (0 <= row

ways[row][col] = ways[row+1][col] + ways[row][col+1]  (0<= row <=m-2, 0<= col <=n-2)


通过这样的分析,我们再来看看代码,理解下哈!


AC代码:

public class Solution {
public int uniquePaths(int m, int n) {
if (m == 0 || n == 0)
return 0;
if (m == 1){
return 1;
}
if (n == 1){
return 1;
}
int[][] ways = new int[m][n];
//最后一列所有的位置的走法都只有1种
for (int i=0; i ways[i][n-1] = 1;
}
//最后一行所有的位置的走法都只有1种
for (int j=0; j ways[m-1][j] = 1;
}
//update
for (int row=m-2; row>=0; --row){
for (int col=n-2; col>=0; --col){
ways[row][col] = ways[row+1][col] + ways[row][col+1];
}
}
return ways[0][0];
}
}


题目四:Unique Paths II

Follow up for "Unique Paths":

Now consider if some obstacles are added to the grids. How many unique paths would there be?

An obstacle and empty space is marked as 1 and 0 respectively in the grid.

For example,

There is one obstacle in the middle of a 3x3 grid as illustrated below.

[
[0,0,0],
[0,1,0],
[0,0,0]
]

The total number of unique paths is 2.

分析:

这道题目跟上面的非常像,只是在判断的时候需要先判断当前自身这个位置是否是1,如果是1表示当前位置是障碍,这样子到达终点的不同路径数就为0,如果不是障碍物的话,那么判断它的右边元素是否是1,不是1的话,加上右边元素对应的路径数,然后再判断它的下面元素是否是1,不是1的话,加上下边元素对应的路径数。

还有要注意的是当开始start元素(0,0)就为1(障碍物)的话 或者 end元素(m-1, n-1)为1(障碍物)那么这样直接返回0,表示没有路径数可以到达终点。 

最终ways[0][0]即是我们所要求解的最后结果。


AC代码:

public class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
if (m == 0)
return 0;
int n = obstacleGrid[0].length;
if (n == 0)
return 0;
if (m == 1 || n == 1){
return (obstacleGrid[m-1][n-1] == 1 || obstacleGrid[0][0] == 1) ? 0 : 1;
}
//终点或者起点为1,表示为障碍物,直接返回0
if (obstacleGrid[m-1][n-1] == 1 || obstacleGrid[0][0] == 1){
return 0;
}
//存储路径数
int[][] ways = new int[m][n];
//处理最后一列
for (int i=m-2; i>=0; --i){
if(obstacleGrid[i+1][n-1] != 1 && obstacleGrid[i][n-1] != 1){
ways[i][n-1] = 1;
}else{
ways[i][n-1] = 0;
obstacleGrid[i][n-1] = 1;
}
}
//处理最后一行
for (int j=n-2; j>=0; --j){
if(obstacleGrid[m-1][j+1] != 1 && obstacleGrid[m-1][j] != 1){
ways[m-1][j] = 1;
}else{
ways[m-1][j] = 0;
obstacleGrid[m-1][j] = 1;
}
}
//update
for (int row=m-2; row>=0; --row){
for (int col=n-2; col>=0; --col){
if (obstacleGrid[row][col] == 1){
continue;
}
ways[row][col] = 0;
if (obstacleGrid[row+1][col] != 1){
ways[row][col] += ways[row+1][col];
}
if (obstacleGrid[row][col+1] != 1){
ways[row][col] += ways[row][col+1];
}
if (ways[row][col] == 0){
obstacleGrid[row][col] = 1;
}
}
}
return ways[0][0];
}
}


题目五:

Trapping Rain Water

 

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

For example, 
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.


The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!


分析:

找到最长的那块木板,假设其下标为maxValueIndex。

分别从左侧和右侧向最长的木板靠近。


左侧逼近过程:(i  :  0 ~~ maxValueIndex

用一个max来记录现在已经遍历到的木板中最长的那个的长度。

1、如果一个木板的长度A[i] maxValueIndex 并且 A[i] ,所以这块木板的左右两侧各有一个木板长于它。则在这块木板上能存的水量为:max - 该木板的长度。

2、如果一个木板的长度A[i]  >max,max对应的位置<该木板的位置 < maxValueIndex 并且A[i]  >max, 所以在该木板左右两侧只有一个木板(maxIdx)长于它。则这块木板上不能存水,则更新max值等于A[i]。


右侧逼近过程与左侧相似:(i  :  len - 1 ~~ maxValueIndex


AC代码:

public class Solution {
public int trap(int[] A) {

int len = A.length;
if (len == 0 || len == 1){
return 0;
}
int sum = 0;
//找最大的木板的下标哈
int maxValueIndex = 0;
int max = 0;
for (int i=0; i if (max max = A[i];
maxValueIndex = i;
}
}
//从左向最大值逼近
max = A[0];
for (int i=1; i if (A[i] > max){
max = A[i];
}else{
sum += (max - A[i]);
}
}
//从右向最大值逼近
max = A[len-1];
for (int i=len-2; i>maxValueIndex; --i){
if (A[i] > max){
max = A[i];
}else{
sum += (max - A[i]);
}
}

return sum;
}
}


推荐阅读
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 广度优先遍历(BFS)算法的概述、代码实现和应用
    本文介绍了广度优先遍历(BFS)算法的概述、邻接矩阵和邻接表的代码实现,并讨论了BFS在求解最短路径或最短步数问题上的应用。以LeetCode中的934.最短的桥为例,详细阐述了BFS的具体思路和代码实现。最后,推荐了一些相关的BFS算法题目供大家练习。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 本文介绍了如何在Jquery中通过元素的样式值获取元素,并将其赋值给一个变量。提供了5种解决方案供参考。 ... [详细]
author-avatar
长江7808
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有