记录leecode刷题思路

39.组合总数

39. 组合总和 - 力扣(LeetCode)

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

示例 1:

输入:candidates = [2,3,6,7], target = 7

输出:[[2,2,3],[7]]

解释:

2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。

7 也是一个候选, 7 = 7 。

仅有这两种组合。

示例 2:

输入: candidates = [2,3,5], target = 8

输出: [[2,2,2,2],[2,3,3],[3,5]]

示例 3:

输入: candidates = [2], target = 1

输出: []

思路如下:此题为标准的回溯法解决的问题

  • 将数组,大集合(存储每个可能结果),小集合(存储每个可能数目),目标值,位置。
  • i= 0开始,小集合放入当期数组中的值,并用目标值减去数组中的值
  • 如果目标值小于0说明该不行,小集合退出该值
  • 如果为0则将小集合放入大集合,但是这是有个问题,必须负责小集合的值存入,小集合中的值改变了,大集合中存入小集合的值也会变
  • i<数组长度 继续进行,否则结束
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
List<Integer> temp = new ArrayList<Integer>();
Arrays.sort(candidates);
find(candidates,target,list,temp,0);
return list;
}
public void find(int[] candidates , int target, List<List<Integer>> list, List<Integer> temp, int num){
if(target< 0) return ;
if(target == 0){
list.add(new ArrayList<>(temp));
return ;
}
for(int i = num; i< candidates.length ;i++){
if(target<0) break;
temp.add(candidates[i]);
find(candidates,target-candidates[i],list,temp,i);
temp.remove(temp.size()-1);
}
}
}

42.接雨水

42. 接雨水 - 力扣(LeetCode)

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]

输出:6

解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

示例 2:

输入:height = [4,2,0,3,2,5]

输出:9

思路如下:对于此题来说理解思路其实和简单,对于能接多少水其实是每个点接水面积的和,对于i点来说来说能接水的面积为Math.min(height(i左侧全部),height(i右侧全部))i点的长度1。思路转换:

  • 暴力破解:

    • 对于每个点都需要求取左侧最大与右侧最大,这样势必会造成浪费,因此这种有重复值计算的方法很容易想到动态规划的方式。
  • 双向链表:

    • 定义一个左侧最大、左侧点位置、右侧最大、右侧点位置,那么双向链表只需要对两侧判断之前的最大值并且不断更新即可。
class Solution {
public int trap(int[] height) {
int count = 0 ;
int left = 0;
int right = height.length-1;
int leftHeight = height[left];
int rightHeight = height[right];
while(left<=right){
if(leftHeight<rightHeight){
leftHeight = Math.max(leftHeight,height[left]);
count = count + Math.max(leftHeight-height[left],0);
left++;
}else{
rightHeight = Math.max(rightHeight,height[right]);
count = count + Math.max(rightHeight-height[right],0);
right--;
}
}
return count; }
}
  • 找到最高点,分别从两端往最高点走

    • 走左边的时候定义一个左侧相对最大temp,如果遍历左侧的点大于temp,那么修改temp的值,如果小于则表示可以存水,temp-height(i)
    • 右侧同理。

46.全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入:nums = [1,2,3]

输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

输入:nums = [0,1]

输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1]

输出:[[1]]

思路如下:这类题目都是同一类型的,用回溯算法!其实回溯算法关键在于:不合适就退回上一步然后通过约束条件, 减少时间复杂度.

class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> list = new ArrayList();
List<Integer> tempList = new ArrayList();
getAll(nums,list,tempList);
return list;
}
public void getAll(int[] nums,List<List<Integer>> list,List<Integer> tempList){
if(tempList.size() == nums.length){
list.add(new ArrayList(tempList));
return ;
}
for(int i =0 ;i < nums.length;i++){
boolean isConrains = tempList.contains(nums[i]);
if(!isConrains){
tempList.add(nums[i]);
getAll(nums,list,tempList);
tempList.remove(tempList.size()-1);
}
}
return;
}
}

48.旋转图像

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]

输出:[[7,4,1],[8,5,2],[9,6,3]]

示例 2:

输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]

输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

48. 旋转图像

class Solution {
public void rotate(int[][] matrix) {
int[][] b = new int[matrix.length][matrix.length];
for (int i = 0; i < matrix.length; i++) {
int[] a = matrix[i];
for (int j = 0 ; j < a.length ; j++){
b[i][j] = matrix[i][j];
}
}
for(int i=0;i<b.length;i++){
int[] a = b[i];
for (int j=0;j<a.length;j++){
matrix[i][j] = b[a.length-j-1][i];
} }
}
}

leecode编写记录的更多相关文章

  1. hudson--ant编写记录

    最近配置Hudson---持续集成工具,重点是ant的编写. 环境:Ubuntu 虚拟机 hudson系统设置里面jdk ant路径也是Ubuntu里文件路径如:/home/test/java/ant ...

  2. Makefile编写记录

    近期学习 Linux 需要使用 Makefile,网上搜罗了很多这方面的资料,所里在这里做一个整理. 1.静态模式 看一个例子: objects = foo.o bar.o all: $(object ...

  3. EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)

    前言 Entity Framework 延伸系列目录 今天我们来聊聊EF的日志记录. 一个好的数据库操作记录不仅仅可以帮你记录用户的操作, 更应该可以帮助你获得效率低下的语句来帮你提高运行效率 废话不 ...

  4. [转]EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)

    本文转自:https://www.cnblogs.com/GuZhenYin/p/5556732.html Entity Framework 延伸系列目录 今天我们来聊聊EF的日志记录. 一个好的数据 ...

  5. 第七章 Odoo 12开发之记录集 - 使用模型数据

    在上一篇文章中,我们概览了模型创建以及如何从模型中载入和导出数据.现在我们已有数据模型和相关数据,是时候学习如何编程与其进行交互 了.模型的 ORM(Object-Relational Mapping ...

  6. uTenux——重新整理底层驱动库

    重新整理底层驱动库 1. 整理chip.h 在chip.h文件中的07----13的宏定义设置位如下,这样我们就不用在工程配中定义sam3s4c这个宏了,为我们以后通用少了一件麻烦事. //#if d ...

  7. 【Java EE】从零开始写项目【总结】

    从零开发项目概述 最近这一直在复习数据结构和算法,也就是前面发出去的排序算法八大基础排序总结,Java实现单向链表,栈和队列就是这么简单,十道简单算法题等等... 被虐得不要不要的,即使是非常简单有时 ...

  8. 【Alpha】Scrum Meeting 11

    目录 前言 任务分配 燃尽图 会议照片 签入记录 前言 第11次会议于4月16日18:15在一公寓三楼召开. 交流确认了任务进度,讨论项目发布事宜,分配下一阶段任务.时长45min. 任务分配 姓名 ...

  9. Qt、C++ 简易计算器

    Qt.C++实现简易计算器: 以下内容是我实现这个简易计算器整个过程,其中包括我对如何实现这个功能的思考.中途遇到的问题.走过的弯路 整个实现从易到难,计算器功能从简单到复杂,最开始设计的整个实现步骤 ...

  10. Flink实战(八) - Streaming Connectors 编程

    1 概览 1.1 预定义的源和接收器 Flink内置了一些基本数据源和接收器,并且始终可用.该预定义的数据源包括文件,目录和插socket,并从集合和迭代器摄取数据.该预定义的数据接收器支持写入文件和 ...

随机推荐

  1. LAN8720 调试笔记

    因为项目需要开始研究LAN8720,还没有仔细研究芯片手册就根据网上能找到的原理图画了第一版电路 调试整整花了我2天半,期间多亏硬汉哥的耐心解答.下面是我调试过程中遇到的一些坑   1.TPTX.TO ...

  2. 记一次修改dotnet-cnblogs图片路径的正则匹配规则

    大佬的GitHub 前言   因为最近一时心血来潮,学了markdown,我觉得但凡是个人,对于不用word或html就可以有不错的排版,而且使用起来简单便捷,都会投向markdown的怀抱中的.又因 ...

  3. Kubernetes--标签选择器(标签)

    标签选择器用于表达标签的查询条件或选择标准,Kubernetes API目前支持两个选择器:基于等值关系(equality-based)以及基于集合关系 (set-based).例如,env=prod ...

  4. 手写g++编译命令行工具笔记

    基本想法 为什么要写 CPPRUN: 如果要开警告开关,敲完整的编译代码还挺麻烦的 想要编译与运行一次性完成 Windows 的控制台本来是 cmd,后来有了 Powershell,但是后者不能用 & ...

  5. Linux编译安装中的--prefix

    本文主要说明--prefix参数的作用,其主要用在编译安装源代码应用中的./configure环节. 1.源码安装一般包括几个步骤:配置(configure),编译(make),安装(make ins ...

  6. Codeforces Round #776 (Div

    Codeforces Round #776 (Div. 3) CodeForces - 1650D Twist the Permutation 给定你数组a:1 2 3 ... n,一共有n次操作,每 ...

  7. GCC gcc 和g++

    GCC:GNU Compiler Collection(GUN编译器集合),它可以编译C,C++,Java,Fortran,Pascal,Object-C等语言. gcc是GCC中的GUN C Com ...

  8. 计算机科学导论-第三版-学习笔记-chapter2-数字系统

    原本看答案的网站被上保护了,我没账号看不了,开摆. 猜测是那边的学生做作业用chatGPT,部分教师觉得不行,禁止使用的同时把答案都上锁了. 也可能是单纯因为我没报课就没账号. 复习题 1.定义一个数 ...

  9. cookie、session入门

    一.cookie是由http制定的 二.使用方法 1.原始方法 使用request接受Cookies请求头 使用response发送set-Cookies响应头 2.常用方法 response.add ...

  10. pycharm永久激活码(亲测好用)

    引用自某不知名大佬,在此致谢,获取激活码链接如下: https://www.ajihuo.com/pycharm/4197.html