2020.11.02-2020.11.15 leetcode刷题总结(分治&递归)

分治算法
一.题目列表
1.**数组中出现次数超过一半的数字 **
题目描述:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

示例:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2

题解:
先排序后返回中间的数
法二:依次计数法

2.**数组中的第K个最大元素 **
题目描述:
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

题解:
先排序后返回第k大
法二:定义一个函数,返回nums[left]在排序数组中的位置,如果==length-k则返回该元素,若小于则left+1,大于则right-1

3.为运算表达式设计优先级
题目描述:
给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。

示例:
输入: “2-1-1”
输出: [0, 2]
解释:
((2-1)-1) = 0
(2-(1-1)) = 2

题解:
递归,设置一个整形队列result存放结果值,依次遍历,将数字分为前后两部分,分别从前后取出所有肯结果,运算后存入result

4.漂亮数组
题目描述:
对于某些固定的 N,如果数组 A 是整数 1, 2, …, N 组成的排列,使得:
对于每个 i < j,都不存在 k 满足 i < k < j 使得 A[k] * 2 = A[i] + A[j]。
那么数组 A 是漂亮数组。
给定 N,返回任意漂亮数组 A(保证存在一个)。

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

题解:
对f(n),将其分为两部分,左边全映射为奇数,右边全映射为偶数,则该数组满足条件

5.** 最小K个数 **
题目描述:
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

示例:
输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]

题解:
排序
最小堆
设计一个partition函数,总最左边元素开始,每次确定一个元素的最终位置,若,知道该元素的位置==k-1,复制数组中的前k个数,因为该位置前的数都小于该元素值

6.** 二叉搜索树与双向链表**
题目描述:
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

示例:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。

为了让您更好地理解问题,以下面的二叉搜索树为例:

我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。

下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。

特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。

题解:

7.** 二叉搜索树与双向链表**
题目描述:
寻找两个正序数组的中位数

示例:
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?

题解:
先求总长度k,若为奇数则寻找k/2+1,否则返回k/2和k/2+1的平均值,定义一个函数寻找k/2,首先判断是否是边界,若不是则找到两个数组的k/2的值并判断大小,同时更新K的值

8.** 合并K个升序链表 **
题目描述:
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例:
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

题解:
先定义一个空链表,然后依次合并两个链表
采用分治的策略,找到中值,合并中值左边的和中值右边的

递归算法
一.题目列表
1.**斐波那契数列 **
题目描述:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

示例:
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

题解:
动态规划

2.**第 N 个泰波那契数 **
题目描述:
泰波那契序列 Tn 定义如下:
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2
给你整数 n,请返回第 n 个泰波那契数 Tn 的值。

示例:
输入:n = 4
输出:4
解释:
T_3 = 0 + 1 + 1 = 2
T_4 = 1 + 1 + 2 = 4
题解:
动态规划

3.**汉诺塔问题* *
题目描述:
在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:
(1) 每次只能移动一个盘子;
(2) 盘子只能从柱子顶端滑出移到下一根柱子;
(3) 盘子只能叠在比它大的盘子上。
请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。
你需要原地修改栈。

示例:
输入:A = [2, 1, 0], B = [], C = []
输出:C = [2, 1, 0]

题解:
递归

4.划分为k个相等的子集
题目描述:
给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。

示例:
输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4
输出: True
说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。

题解:
先求和,然后排序,然后找到不等于sum/k的位置,定义一个函数,将数组中的每个数依次放入要返回的数组

5.**最长同值路径 **
题目描述:
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。

示例:
输入:

          5
         / \
        4   5
       / \   \
      1   1   5

输出:
2

题解:
定义一个全局变量表示最长路径长度,赋初值为0,然后遍历该二叉树,定义一个左右子树中的最长路径,并返回该值

6.**二叉搜索树的范围和 **
题目描述:
给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。

题解:

7.**第K个语法符号 **
题目描述:
在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为01,1替换为10。
给定行数 N 和序数 K,返回第 N 行中第 K个字符。(K从1开始)

例子:
输入: N = 1, K = 1
输出: 0
输入: N = 2, K = 1
输出: 0
输入: N = 2, K = 2
输出: 1
输入: N = 4, K = 5
输出: 1
解释:
第一行: 0
第二行: 01
第三行: 0110
第四行: 01101001

题解:
数学递归

8.**数值的整数次方 **
题目描述:
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

例子:
输入: 2.00000, 10
输出: 1024.00000

题解:
扩大底数,缩小指数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值