数据结构与算法-递归-leetcode练习

数据结构与算法——LeetCode编码练习01 本文总结了几种链表常见问题的解法,包括环形链表检测(141/142题)、快乐数判断(202题)、链表反转(206/92/25题)、旋转链表(61题)、节点交换(24题)和节点删除(19/83题)。主要使用了哈希表法和快慢指针法两种技术:哈希表法通过存储访问过的节点判断重复;快慢指针法则利用双指针不同步长检测环或定位特定位置。链表反转问题展示了迭代法的通用解法,而分组反转和删除问题则体现了对边界条件的处理技巧。这些解法涵盖了链表操作的核心模式,具有较高的实用价值。 阅读详情

递归

 

编写递归要决,千万不要用人脑去递和归每一层,正确的做法是找到如何分解为子问题,然后几个子问题的关系是什么。然后翻译成代码。

 

leetcode17

题目描述:

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

 

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

 

 

示例:

 

输入:"23"

输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

说明:

尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

 

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

解题思路

先说最简单的,对应数字与字符的对应关系,我们可以用数组来记录,下标为代表0到9的数字,值即为每个字符串,由于0和1都没有字符,为了使用方便,还是使用空字符来占用。即可表示为

String[] dict = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

 

再来说如何组合所有可能性,还不能重复。比如输入23

 

类比我们人脑来处理的过程就是这样:

先取2的第一个字符与后面每个字符组合,然后再取出3的每个字符与后面组合即可得到所有可能性。

使用递归还求解,需定能定义出来递推公式,可我数学公式基本已经还给老师了,实在是对不起老师呀,还是来想想处理过程吧。

 

递归需要我们将问题分解为多个子问题。那我们如何分解呢?

刚刚人脑的处理过程就取出数字对应的字符串,然后一个一个的遍历,与之前的字符进行组合,这是递归的处理逻辑,当我们遍历到输入数字最后一个时,就需要将每个数字组合进行记录。这是递归的终止条件。

 

然后我们此翻译成代码:

 

解题实现

public class RecurstionSolution {

 
private static final String[] STAT_CODE =
     
new String[] {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

  public
List<String> letterCombinations(String digits) {

    List<String> result =
new ArrayList<>();
    if
(digits == null || digits.isEmpty()) {
     
return result;
   
}

    String inputData = digits.trim()
;
   
// 1,将输入的字符转化为数字
   
int[] dataNum = new int[inputData.length()];

    for
(int i = 0; i < inputData.length(); i++) {
      dataNum[i] = inputData.charAt(i) -
'0';
   
}

    String dataChar =
"";

    this
.recurstionData(dataNum, 0, result, dataChar);
    return
result;
 
}

 
/**
   *
进行递归的求解
  
*
   * @param
dataNum 输入字符
  
* @param index 索引号
  
* @param list 数据集合
  
* @param dataChar 当前的字符
  
*/
 
private void recurstionData(int[] dataNum, int index, List<String> list, String dataChar) {
   
// 1,递归的终止条件
   
if (index == dataNum.length) {
      list.add(
new String(dataChar));
      return;
   
}

   
// 进行递归的求解
   
for (int i = 0; i < STAT_CODE[dataNum[index]].length(); i++) {
      dataChar = dataChar +
STAT_CODE[dataNum[index]].charAt(i);
     
// 当取出一个字符后继续进行遍历
     
this.recurstionData(dataNum, index + 1, list, dataChar);
     
// 当遍历完成后,需要删除当前的最后一个字符,以可以与其他进行组合
     
dataChar = dataChar.substring(0, dataChar.length() - 1);
   
}
  }
}

 

 

leetcod22

题目描述:

22. 括号生成
给出
 n 代表生成括号的对数,请你写出一个函数,
使其能够生成所有可能的并且有效的括号组合。

例如,给出
 n = 3,生成结果为:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]


来源:力扣(LeetCode)
链接:
https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

 

解题思路:

这个题目说实话我也做错了,我开始的解题思路是以成对的括号为单位,我想的是在括号的左边 ,右边,还有中间,依次的插入号位,递归这样就可以求解了,但当我实现的时候,我发现,我的思路是错误的,因为当遍历到多层时,这个中间括号已经无法再明确的定义,需要寻找其他解法。

我又来参照了其他的方案,终于理解了这个递归的求解方法:

这个问题的求解可以分为两部分,添加左括号、和添加右括号,添加的个数正好是输入的数字,例如3,就是可以添加3个左括号和3个右括号。

那现在就是如何添加左括号和右括号的问题:

先说左括号,最大左括号不就是输入的数字么,所以需要一个左括号的索引来记录当前是第几个左括号,需要小于最大左括号。添加一个括号即可

当左括号添加了,那右括号嗯,是否和左括号一样,这个还是有点不一样呢,右括号需要与左括号成对出现,就不能出现右括号比左括号还多的情况,这样最大右括号需要小于当前的左括号数了。

递归终止条件是什么呢,当然是当前括号数满足了输入的括号数*2,例如输入3,就是6个,左路输入左右括号数,一样要是6个。现在来翻译成代码吧.

 

递归代码实现

public class SolutionParthese2 {

 
public static final String PARENTHESE_LEFT = "(";
  public static final
String PARENTHESE_RIGHT = ")";

  public
List<String> generateParenthesis(int num) {
    List<String> result =
new ArrayList<>();

    if
(num == 1) {
      result.add(
PARENTHESE_LEFT + PARENTHESE_RIGHT);
      return
result;
   
}

   
if (num == 0) {
     
return result;
   
}

   
this.recurstion(num, 0, 0, result, "");

    return
result;
 
}

 
/**
   *
递归求最大括号的组合
  
*
   * @param
maxNum 最大索引号
  
* @param left 左索引号
  
* @param right 右索引号
  
* @param resultLst 存储的结果数
  
* @param data 当前已经得到的括号组合
  
*/
 
public void recurstion(int maxNum, int left, int right, List<String> resultLst, String data) {
   
// 1,首先写递归的终止条件
   
if (data.length() == maxNum * 2) {
      resultLst.add(data)
;
      return;
   
}

   
// 添加左括号
   
if (left < maxNum) {
     
this.recurstion(maxNum, left + 1, right, resultLst, data + PARENTHESE_LEFT);
   
}

   
// 添加右括号,右括号,需要小于左括号,否则不对成对了
   
if (right < left) {
     
this.recurstion(maxNum, left, right + 1, resultLst, data + PARENTHESE_RIGHT);
   
}
  }
}

 

 

leetcode39

题目描述:

39. 组合总和
给定一个无重复元素的数组
 candidates 和一个目标数 target ,
找出
 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

说明:

所有数字(包括
 target)都是正整数。
解集不能包含重复的组合。
 
示例 1:

输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
  [7],
  [2,2,3]
]

示例 2:

输入: candidates = [2,3,5], target = 8,
所求解集为:
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]


来源:力扣(LeetCode)
链接:
https://leetcode-cn.com/problems/combination-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

解题思路:

 

 

这个是一个求组合的问题,我的求解思路是这样子的,将数组中的每个元素,从当前自己开始,依次与一个元素相加,如果超过了,说明符不合,如果与预期值相同,则记录下来,未到达退出条件则继续递归。为了确保无重复的数据,可使用set来进行存储

 

编码实现

public class SolutionMySelf {

 
public List<List<Integer>> combinationSum(int[] inputSrc, int target) {

   
if (inputSrc == null || inputSrc.length == 0) {
     
return null;
   
}

    List<Integer> currList =
new ArrayList<>();
   
Set<List<Integer>> collect = new HashSet<>();

    this
.recurstion(inputSrc, target, 0, 0, currList, collect);

   
List<List<Integer>> result = new ArrayList<>(collect);

    return
result;
 
}

 
/**
   *
进行问题的递归求解,对于重复的数据项,即通过起始值来操作,当已经遍历过的数据,将不再遍历。
  
*
   * @param
inputSrc 输入数组
  
* @param target 目标值
  
* @param value 当前的值
  
* @param startIndex 开始的索引号,小技巧,这样可以避免重复的计算。只需要从当前向后推进即可
  
* @param collect 当前已经记录的集合
  
* @param resultList 记录下已经求解的数据集
  
*/
 
private void recurstion(
     
int[] inputSrc,
      int
target,
      int
value,
      int
startIndex,
     
List<Integer> collect,
     
Set<List<Integer>> resultList) {

   
// 1,递归的终止条件
   
if (value == target) {
      resultList.add(
new ArrayList<>(collect));
      return;
   
}
   
// 2,超过出说明不符合直接退出
   
if (value > target) {
     
return;
   
}

   
for (int i = startIndex; i < inputSrc.length; i++) {
      value = value + inputSrc[i]
;
     
collect.add(inputSrc[i]);
      this
.recurstion(inputSrc, target, value, i, collect, resultList);
     
// 当结束后,需要移除最后一个元素
     
collect.remove(collect.size() - 1);
     
value = value - inputSrc[i];
   
}
  }
}

 

 

leetcode46

题目描述:

给定一个没有重复数字的序列,返回其所有可能的全排列。

示例
:

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


来源:力扣(LeetCode)
链接:
https://leetcode-cn.com/problems/permutations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

解题思路:

我的解题思路就是将数组中的每个元素与剩下的两个元素进行组合,当给合的大小与数组大小一致就放入到结果集中。那如何表示剩余下元素呢,我的办法是将已经遍历过程下标通过一个boolean数组记录下来,这样就能知道了

 

代码实现

public class SolutionPermute {

 
public List<List<Integer>> permute(int[] nums) {

    Set<List<Integer>> data =
new HashSet<>();
   
List<Integer> currdata = new ArrayList<>();

    boolean
[] exists = new boolean[nums.length];

    this
.recurstion(nums, data, currdata, exists);

   
List<List<Integer>> result = new ArrayList<>(data);

    return
result;
 
}

 
private void recurstion(
     
int[] nums, Set<List<Integer>> data, List<Integer> currdata, boolean[] exists) {

   
// 如果当前组合到达组合的结果大小,则加入到结果集中
   
if (currdata.size() == nums.length) {
      data.add(
new ArrayList<>(currdata));
      return;
   
}

   
for (int i = 0; i < nums.length; i++) {
     
// 仅对未遍历过元素进行遍历
     
if (!exists[i]) {
        exists[i] =
true;

       
currdata.add(nums[i]);

        this
.recurstion(nums, data, currdata, exists);
       
currdata.remove(currdata.size() - 1);

       
exists[i] = false;
     
}
    }
  }
}

 

 

 

leetcode79

 

题目描述:

79. 单词搜索

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中
“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例
:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]


给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.

来源:力扣(LeetCode)
链接:
https://leetcode-cn.com/problems/word-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

 

解题思路

 

针对此单词搜索,因为存在4种匹配的情况:

情况1,横坐标+1可匹配

情况2,横坐标-1可匹配

情况3,纵坐标+1可匹配

情况4,纵坐标-1可匹配

 

递归的终止条件呢?当发生字符不匹配,搜索终止,或者搜索到匹配字符,搜索终止,那过有其他条件吗?当然有,那就是横纵坐标,必须在字符的下标范围以内

 

 

代码实现

public class SolutionRectustionMySelf {

 
public boolean exist(char[][] src, String data) {

   
boolean[][] exists = new boolean[src.length][src[0].length];

    boolean
existsResult = false;

   
String srcvalue = null;

   
//搜索开始的字符位置
   
for (int i = 0; i < src.length; i++) {
     
for (int j = 0; j < src[i].length; j++) {
        srcvalue = String.valueOf(src[i][j])
;
        if
(data.startsWith(srcvalue)) {
          existsResult =
this.exist(src, "", data, i, j, exists);

          if
(existsResult) {
           
return true;
         
}
        }
      }
    }

   
return false;
 
}

 
/**
   *
每个字符的匹配可以看作是当前字符与其他字体的一个匹配
  
*
   * @param
src 原始的匹配字符数组
  
* @param currData 当前的字符
  
* @param targetData 匹配的目标字符
  
* @param rowindex 行索引
  
* @param cellindex 列索引
  
* @return
  
*/
 
public boolean exist(
     
char[][] src,
     
String currData,
     
String targetData,
      int
rowindex,
      int
cellindex,
      boolean
[][] exists) {

   
if (currData.equals(targetData)) {
     
return true;
   
}

   
if (rowindex < 0 || rowindex >= src.length) {
     
return false;
   
}

   
if (cellindex < 0 || cellindex >= src[rowindex].length) {
     
return false;
    
}

   
// 节点已经访问,则标识为false
   
if (exists[rowindex][cellindex]) {
     
return false;
   
}

    currData = currData + src[rowindex][cellindex]
;

    if
(currData.length() > targetData.length()) {
     
return false;
   
}

   
// 在进入时标识已经访问
   
exists[rowindex][cellindex] = true;

   
// 当字符匹配的时,可能存在4个方向的情况
   
if (targetData.startsWith(currData)) {
     
if (exist(src, currData, targetData, rowindex + 1, cellindex, exists)
          || exist(src
, currData, targetData, rowindex, cellindex + 1, exists)
          || exist(src
, currData, targetData, rowindex - 1, cellindex, exists)
          || exist(src
, currData, targetData, rowindex, cellindex - 1, exists)) {
       
return true;
     
}
    }
   
// 退出时还需要标识出未访问
   
exists[rowindex][cellindex] = false;

    return false;
 
}
}

 

数据结构与算法——LeetCode刷题02 本文介绍了二叉树的基本概念、性质和应用。重点内容包括:二叉树的性质证明(度为0的节点比度为2的多一个)、三种遍历方式(前序、中序、后序)以及特殊二叉树类型(完全、满、完美二叉树)。通过LeetCode经典题目展示了递归和迭代在二叉树遍历中的应用,如前序遍历的三种实现方法(递归、普通迭代、状态栈),以及N叉树遍历、二叉树翻转和层序遍历等算法。这些内容为理解高级数据结构和掌握递归技巧奠定了基础。 阅读详情

相关推荐

LeetCode JavaScript 问题解决方案集锦

本文还有配套的精品资源,点击获取 简介:LeetCode 是一个编程练习平台,提供多样编程语言的算法题目,尤其适用于前端和全栈开发者的 JavaScript。此压缩包文件 "LeetCode-master" 包含了完整的 JavaScript 解决方案代码库。通过解决 LeetCode 的 JavaScript 题目,开发者可以提升编程技能,掌握多种算法和数据结构,如数组、...

weixin_35899324的博客 1321

《算法和数据结构》LeetCode 篇

面试中所有需要用到的算法都在这里了!

英雄哪里出来 1万+

Mid-360激光雷达与Fast-LIO2实战:从环境搭建到实时点云建图

本文提供Livox Mid-360激光雷达与Fast-LIO2算法从零开始的实战教程。详细介绍了在Ubuntu和ROS环境下进行系统配置、依赖安装、硬件连接与网络设置的完整流程,并指导如何运行算法实现实时点云建图与可视化,最后总结了关键参数调优与常见问题排查方法。

weixin_29300241的博客 152

数据结构与算法【Leetcode - 力扣】超详细算法刷题笔记(更新中)

题目描述:大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。斐波那契数列是一个满足: fib(x)={x=1x=0,x=2y=fib(x−1)+fib(x−2)x>2 fib(x)=\left\{ \begin{aligned} x & = & 1 && x = 0, x=2 \\ y & = & fib(x-1)+fib(x-2) && x >2\end{aligned} \right. fib(x)={xy​==​1fib(x−1)+fib(x−2)​​x=0,

唤醒手腕 1922

colmap+openMVS稠密重建

简要记录一下colmap+openMVS稠密重建相关使用。

weixin_41631106的博客 2241

RK3588视频转码实战:如何用FFmpeg+MPP实现16路1080P硬解压(附完整命令)

本文详细介绍了如何在RK3588处理器上使用FFmpeg和MPP框架实现16路1080P视频的硬件加速转码。通过解析RK3588的视频处理架构、环境搭建步骤和实战配置,提供了完整的命令示例和性能调优建议,帮助开发者高效处理多路视频转码任务。

weixin_29233333的博客 555

【数据结构与算法】 LeetCode:回溯

左括号 ‘(’ 必须用相同数量的右括号 ‘)’ 闭合。左括号 ‘(’ 必须在对应的右括号 ‘)’ 之前。

weixin_44378835的博客 603

【Xilinx】如何在petalinux下编译vcu-gst-app以及独立编译vcu-gst-app

Xilinx从2018.1开始,提供了一套基于zcu106的vcu参考设计。里面提供了一套基于GStreamer的程序,即vcu-gst-app。如何脱离petalinux直接编译呢,这里以为例,其他版本也是类似的操作。

王师傅 3039

Leetcode算法基础篇-递归算法

递归(Recursion):指的是一种通过重复的方法。在绝大数编程语言中,可以通过在函数中再次调用函数自身的方式来实现递归。

deardeer的博客 981

TensorFlow GPU版本安装步骤-Windows系统

本文由在Windows下安装TensorFlow GPU版本教程-优快云等整理得到。 目录 1、确认显卡是否支持CUDA 1.1 查看显卡信息 打开“设备管理器”,查看显卡信息,如下图所示: 由上图知,本电脑的显卡为NVIDIA Quadro P400. 1.2 查看支持CUDA的显卡 网址:https://developer.nvidia.com/cuda-gpus 经查询可知,该显卡支持CUDA,如下图所示: 2、安装CUDA 2.1 下载CUDA 网址:https://developer.nvi

x_lingyun的专栏 764

学Simulink——基于Simulink的超前-滞后校正控制器设计与仿真建模示例

本文完成了基于 Simulink 的超前-滞后校正控制器设计与仿真,实现了:✅掌握超前与滞后校正的物理意义与设计流程✅分步设计复合控制器,兼顾动态与稳态✅在 Simulink 中搭建闭环系统并验证卓越性能✅达成高稳定裕度、高精度、快速响应三大目标。

xiaoheshang_123的博客 78

leetcode 之 数据结构与算法

节点ListNode:定义节点,值,指针。

qq_44407313的博客 1202

项目报告:基于Sentaurus TCAD的多沟道长度NMOS器件仿真、SPICE模型提取与环形振荡器电路验证

本项目基于Sentaurus TCAD工具,完成了从器件仿真到电路验证的全流程研究。首先构建了45nm、65nm和90nm三种沟道长度的NMOS器件,通过TCAD仿真分析了其电学特性,观察到明显的短沟道效应。随后提取了BSIM4 SPICE模型参数,并生成Hspice可用的模型文件。最后利用该模型设计了11级环形振荡器进行电路验证,证明了模型的实用性。研究结果表明,随着沟道长度缩短,器件性能虽有所提升,但短沟道效应导致关态电流显著增加,影响整体能效。本项目为纳米尺度MOSFET的建模与电路设计提供了完整的技

huanghm88的专栏 284

算法与数据结构

Algorithm leetcode/lintcode上的算法题 关于问题的答案和解体的思路,可以移步 : https://github.com/zhaozhengcoder/Algorithm About 这个仓库最初的想法是把lintcode/lintocde上面的算法题目整理一下,因为很多题目太多了显得太乱了,就不继续在GitHub上面写了,以前写的一部分移到我的博客上面了。 GitHub...

weixin_37097995的博客 92

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

算法学习第一天

算法学习第一天:链表反转

Echo323的博客 237

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

《数据结构与算法之美》学习汇总

此篇文章是对自己学习这门课程的一个总结和课后的一些练习,做一个汇总,希望对大家有帮助。本人是半路程序员,2018年2月开始学习C++的,下面的代码基本都是C++11版本的,代码有错误的地方请不吝留言赐教。附有部分练习LeetCode、POJ的题目。

Michael是个半路程序员 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数据结构与算法(数组,栈,队列,链表,哈希表,搜索算法,排序算法,查找算法,策略算法,递归算法,二叉搜索树BST,动态规划算法)

为了求职面试,面试重灾区+大厂必考题程序 = 数据结构 + 算法求职面试难,继续卷出新高度算法可以衡量程序员的技术功底算法可以体现程序员的学习能力和成长潜力学习算法有助于提高分析解决问题的能力学习算法是做性能优化、成长为架构师的必经之路数组栈队列链表树(二分搜索树)堆。。。​ 刷题地址:​ 力扣:https://leetcode.cn/程序 = 数据结构 + 算法数据结构是算法的基础,好的算法也离不开数据结构编程中遇到的问题:下图情形如何实现存档功能?数据结构是为了高效访问数据而设计出的一种数据的组织和存

小丁的博客 1268

数据结构与算法之美

的情况进行特殊处理。如果我们引入哨兵结点,在任何时候,不管链表是不是空,head 指针都会一直指向这个哨兵结点。我们也把这种有哨兵结点的链表叫带头链表。相反,没有哨兵结点的链表就叫作不带头链表。

qq_40003391的博客 2279

【力扣练习题】【递归】 203. 移除链表元素

shou10jin的博客 113

leetcode 101.对称二叉树

最是那一低头的温柔,像是一朵水莲花不胜凉风的娇羞。

夜空像是一片紫水潭,星星是些不动的大亮点,夜风是些浅蓝色的流线,云端传来喧嚣的声音。 227

数据结构1 -- leetcode练习

三. 练习 3.1 时间复杂度 用函数 f(n)f(n)f(n) 表示算法效率与数据规模的关系,假设每次解决问题需要 1 微秒(10−610^{-6}10−6 秒),进行估算: 如果 f(n)=n2f(n) = n^2f(n)=n2 那么 1 秒能解决多少次问题?1 天呢? 如果 f(n)=log2(n)f(n) = log_2(n)f(n)=log2​(n) 那么 1 秒能解决多少次问题?1 天呢? 如果 f(n)=n!f(n) = n!f(n)=n! 那么 1 秒能解决多少次问题?1 天呢? 参考

m0_64378422的博客 955

算法与数据结构实战秘籍:100道LeetCode解题与系统学习终极指南 [特殊字符]

在计算机科学学习之旅中,**算法与数据结构**无疑是每个程序员必须掌握的核心技能。无论是准备技术面试、提升编程能力,还是构建更高效的软件系统,扎实的算法基础都是成功的关键。今天,我将为你带来一份完整的算法与数据结构实战指南,帮助你通过100道精选LeetCode题目,系统性地掌握这一重要领域。 ## 为什么算法与数据结构如此重要?🤔 正如TeachYourselfCS-CN项目中所强调的:"

gitblog_01112的博客 967

算法通关40讲 笔记一(复杂度, Leetcode刷题技巧)

今天开始利用20天,把算法通关40讲再过一遍,巩固下数据结构和算法的知识点。 数据结构与算法 时间复杂度和空间复杂度 常用的复杂度如下: 在实际工程中,尤其对于大数据而言,复杂度至关重要。 如何用for循环就是O(n),如果用数学公式就是O(1)。 下面的递归方法看似简单,实际上时间复杂度很高,有很多无效计算 主理论,记住下面的4个复杂度。 Leetcode刷题:刻意练习,必须保证3分的知识点,7分的刷题。刷题刷的不顺手,就对了。对于自己不熟悉的知识点,应该重点攻克。比如二叉树,动态规

爱学习的大叔的博客 278

2025年4月蓝桥杯练习

【代码】2025年4月蓝桥杯练习。

binboming的博客 1329

LeetCode_2_两数之和

LeeCode_1_两数之和 @此博客转载自**LeeCode官方** @此博客仅用于学习 题目描述: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] =

qq_45735862的博客 192
上一篇: linux下安装MySQL-server-5.6.28
下一篇: 学习笔记--数据结构与算法--分析排序算法
null_null_bug
博客等级 码龄7年 72粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值