2.1 数据结构---数组

(一)数组

 

 

总结:

  利用序:理解二分查找

  利用前缀和:查找、计算、排序

  理解数组:map

  用数组实现高级数据结构:一般树(存每个节点的父亲【并查集】);二叉树(下标从1开始a[i]的儿子是a[i*2]和a[i*2+1])(堆)

  简单题:分治法求逆序对数;有序数组归并;两个有序数组的中位数;两头扫的方法(2-SUM,3-SUM)

 

(二)算法

一、排列、组合、子集

1.子集

(1)Leetcode78:子集

题目描述:给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:
输入: nums = [1,2,3]
输出:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]  

思路:

1.回溯法

2.Python的extend功能

 

方法1代码:

方法2代码:

1
2
3
4
5
def subsets_way1(nums):
    result = [[]]
    for x in nums:
        result.extend([subset + [x] for subset in result])
    return result

 

(2)Leetcode90:子集II

题目描述:给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

 

这道题与78题区别在于,数组里包含了重复数组,一般有3种办法:

1.用上面一题方法,把相同的不加入

2.在递归时候,加个判断,发现此位置和前位置相等,就跳过(必须是有序列表)

3.先按78的思路,把重复的也算出来,再用dict遍历一遍,去重(这个方法比较笨重)

 

方法1、2代码:

方法3代码:

   

2.全排列

(1)Leetcode46:全排列

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

示例:

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

思路:

1.直接调用Python的itertools.permutations包,不过返回的是tuple类型的;

2.回溯法,递归得到结果

(1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀);

(2)出口:如果只有一个元素的全排列,则说明已经排完,则输出数组;

(3)不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组;

 

方法1代码:

方法2代码:

 

(2)Leetcode47:全排列II

题目描述:给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:

1
2
3
4
5
6
7
输入: [1,1,2]
输出:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]
两种思路:

1.一种是列出所有的排列,再去重(笨重的方法)

2.递归,交换之前先判断是否已经出现重复的元素,若存在,就不交换

 

方法1代码:

方法2代码:依旧全排列的思路,只不过需要定义一个set来存储已经交换过的元素值,也就是已经做过某个排列的首元素的值存放在set中,避免重复这种情形。

 

3.组合总和

(1)Leetcode39:组合总和

题目描述:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。

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

示例:

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

 思路1:回溯法递归求解

 

(2)Leetcode40:组合总和II

题目描述:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。

说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。

示例:

1
2
3
4
5
6
7
8
输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]

思路1:回溯法,递归求解,因为不能重复使用列表中的元素,所以下一次递归要从下个元素开始(不包括自身)

 

4.分割回文串

(1)Leetcode131:分割回文串

题目描述:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。

示例:

1
2
3
4
5
6
输入: "aab"
输出:
[
  ["aa","b"],
  ["a","a","b"]
]

思路1:回溯法

题目要求返回所有的可能方案,所以依旧采用回溯算法。循环查看当前字符串的每一个可切分位置位;判断若在当前位置切分,前半部分是否是回文串。若是,则将前半部分存入当前解,并递归分割后半部分。
例如输入字符串为示例:
|a  |a  |b  |
0 1 2 3 
首先判断分割位1,发现前半部分‘a’是回文串,将‘a’存入temp_list,将后半部分‘ab’用作递归。当遍历到字符串尾端时,递归结束,将temp_list加入的res,最终返回res.

 

二、动态规划

 

 

 

三、查找和排序

1.二分查找

(1)局部极小值

 

 

2.元素交换

(1)第一个缺失的正整数

 

 

3.排序、中位数

(1)元素最大间距离

(2)众数

 

 

 

 

4.归并

 

5.位运算

(1)只出现一次的数

 

 

 

6.前缀和的应用

 

 

 

 

 

 

 

 

参考文献:

【1】回溯算法系列




posted @   nxf_rabbit75  阅读(518)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
(一)数组(二)算法一、排列、组合、子集1.子集(1)Leetcode78:子集(2)Leetcode90:子集II2.全排列(1)Leetcode46:全排列(2)Leetcode47:全排列II3.组合总和(1)Leetcode39:组合总和(2)Leetcode40:组合总和II4.分割回文串(1)Leetcode131:分割回文串二、动态规划三、查找和排序1.二分查找(1)局部极小值2.元素交换(1)第一个缺失的正整数3.排序、中位数(1)元素最大间距离(2)众数4.归并5.位运算(1)只出现一次的数6.前缀和的应用
点击右上角即可分享
微信分享提示