算法练习--leetcode 数组

文章目录

  • 爬楼梯问题
  • 裴波那契数列
  • 两数之和 [数组]
  • 合并两个有序数组
  • 移动零
  • 找到所有数组中消失的数字
  • 三数之和

爬楼梯问题

输入n阶楼梯,每次爬1或者2个台阶,有多少种方法可以爬到楼顶?

示例1:输入2, 输出2
一次爬2阶;
一次爬1阶;
故两种方法。

示例2:
输入3, 输出3
三个1;
一个1 + 一个 2;
一个2 + 一个1;

思路分析:
采用递归求解
在这里插入图片描述

python实现:

# 递归
def climb_stairs(n):if n == 1:return 1elif n == 2:return 2elif n >= 3:return climb_stairs(n-1) + climb_stairs(n-2)# 递归优化,避免重复计算(优化效果微小)
def climb_stairs_2(n):d = {}if n == 1:return 1elif n == 2:return 2elif n >= 3:if n in d:return d.get(n) # 避免一部分递归操作cur = climb_stairs(n-1) + climb_stairs(n-2)d[n] = curreturn cur# 循环一次计算(自底向上依次计算)
# O(n)
def climb_stairs_3(n):if n == 1:return 1elif n == 2:return 2elif n >= 3:a = 1b = 2result = 0for i in range(3, n+1):result = a + ba = bb = resultreturn result

java实现

// O(n)
class Solution{public int climbStairs(int n){if(n == 1) return 1;else if(n == 2) return 2;else if(n >= 3){int result = 0;int a = 1;int b = 2;for(int i=3; i<=n; i++){result = a + b;a = b;b = result;}return result;}}
}

裴波那契数列

在这里插入图片描述
类似爬楼梯问题。
 

两数之和 [数组]

给定一个整数数组 nums 和一个整数目标值 target,在该数组中找出 等于目标值 target 的那两个整数,并返回它们的数组下标。

假设每种输入只会对应一个答案,且数组中同一个【位置】的元素在答案里不能重复出现。

示例 1:
输入:nums = [2,7,11,15], target = 9

输出:[0,1]

解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6

输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6

输出:[0,1]

暴力解法

  • 依次遍历元素,计算求和,并比较。
  • 时间复杂度 O ( n 2 ) {O(n^2)} O(n2)
  • python实现
# O(n^2)
def calcSum(arr, target):n = len(arr)for i in range(n-1):for j in range(i+1, n):if arr[i] + arr[j] == target:return [i, j]raise ValueError("未找到结果")
  • java实现
在这里插入代码片

哈希优化

  • 遍历数组,索引为 i;
  • 判断 left = target - array[i] ,left 值是否存在于hash;
    • 存在,则返回索引 i 和 hash中left 对应的值;
    • 不存在,则将 array[i] :i 存入hash;
  • 时间复杂度 O ( n ) {O(n)} O(n)
  • python实现
# python
def optimize_calc_sum(alist, target):dict_ = {}n = len(alist)for i in range(n):if target - alist[i] in dict_:return [i, dict_.get(target - alist[i])]dict_[alist[i]] = iraise ValueError("未找到结果")
  • java实现
在这里插入代码片

 

合并两个有序数组

给两个非递减排列的整数数组arr1、arr2,m 和 n 分别表示arr1 、arr2的元素个数;合并arr2到arr1中,合并后元素非递减排列。

示例1:
arr1 = [1, 2, 3, 0, 0, 0] m = 3
arr2 = [2, 5, 6] n = 3
合并结果:[1,2,2,3,5,6] 黑体数字为arr2中的元素

示例2:
arr1 = [1]
arr2 = [ ]
合并结果: [1]

python实现


arr1 = [1, 3, 4, 0, 0, 0]
m = 3
arr2 = [2, 5, 6]
n = 3def merge_array(arr1, m, arr2, n):# 准备临时数组temp = []   # 空间复杂度O(m+n)i = 0j = 0while i < m and j < n:  # O(m+n) 线性复杂度if arr1[i] <= arr2[j]:temp.append(arr1[i])i += 1else:temp.append(arr2[j])j += 1if i == m:temp.extend(arr2[j:n])elif j == n:temp.extend(arr1[i:m])for i in range(m + n):arr1[i] = temp[i]print("arr1:", arr1)return arr1

java实现:
在这里插入图片描述

移动零

给定一个数组array,将内部所有的0移动到数组的末尾,并保持非零元素的相对顺序。必须原位操作,不能拷贝额外的数组。
示例:
输入,[0, 1, 0, 3, 12]
输出,[1, 3, 12, 0, 0]

提示:双指针

python实现

# 暴力实现
arr = [0, 1, 0, 3, 12, 0, 0, 13, 0, 14, 0, 18, 0, 0, 0]# 依次将遍历的首个0值与后面的非0置换
def move_zero(arr):n = len(arr)for i in range(n):if arr[i] != 0:continuek = i # 记录当前0的位置j = i + 1 # 下一个元素的位置while j < n:if arr[j] == 0:j += 1continuearr[k], arr[j] = arr[j], arr[k]k = jj += 1print("result:", arr)return arr# 双指针
# 双指针同时从0开始
# 依次将后一个指针的非0值,放到前一个指针的位置,前一个指针+1,继续下次循环
# 最后将后一个指针处到结束 均赋值0
# 时间复杂度 O(2n)
def move_zero_double_pointer(arr):n = len(arr)j = 0 # j指针for i in range(n): # i指针  两个指针同时从0开始if arr[i] != 0:arr[j] = arr[i]j += 1# 将从j开始的元素 全部赋值0while j < n:             # 时间复杂度 O(2n)arr[j] = 0j += 1print("result:", arr)return arr

java实现:双指针移动0
在这里插入图片描述

 

找到所有数组中消失的数字

给定一个n个整数的数组array,每个元素值在【1,n】之间,找出1-n内没有出现在array中的数字,以数组形式返回。
n为数组的长度;

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

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

进阶:可以不借助额外空间且时间复杂度为O(n),解决吗?

python实现

# 暴力实现
def find_missing_digit(arr):n = len(arr) # [1, ..., n]# arr去重temp = []  # 空间复杂度O(n)for i in range(1, n+1):  # 时间复杂度 O(n)if i not in arr:temp.append(i)print("result:", temp)return temp# 优化空间复杂度O(1)
# 只能依赖数组本身的空间
# 所有元素的值 - 1 可以对应索引,对应索引处的值 都+n 或者2n....
# 而缺失的那些值 - 1 对应的索引处的值肯定没有变化,即 <= n
# 最后循环找到<=n的元素,其索引+1 就是缺失的值
def optimize_find_missing_digit(arr):n = len(arr)# 空间复杂度为O(1)  只能使用数组本身的空间for i in arr:idx = (i - 1) % n # 得到对应的索引(拿到的i可能是已改过的) 所以需要还原索引arr[idx] += 2 * ntemp = []  # 存储最终结果的空间不算 额外空间for i in range(n):if arr[i] <= n:temp.append(i + 1)print("result:", temp)return temp

java实现
在这里插入图片描述

 

三数之和

给一个整数数组 nums ,判断是否存在三元组 [ nums[i], nums[j], nums[k] ] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。返回所有和为 0 且不重复的三元组,如果三个元素只是顺序不同,则算重复的三元组。

示例 1:
输入:[-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:
输入:[0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:
输入:[0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

提示:
3 <= nums.length <= 3000
-105 <= nums[i] <= 105

python实现:

# 暴力解法 O(n^3)   会产生重复的三元组
arr = [-1,0,1,2,-1,-4]
def three_nums_sum(arr: List[int]) -> List[List[int]]:n = len(arr)temp = []for i in range(n-2):for j in range(i+1, n-1):for k in range(j+1, n):if arr[i] + arr[j] + arr[k] == 0:temp.append([arr[i], arr[j], arr[k]])# result: [[-1, 0, 1], [-1, 2, -1], [0, 1, -1]]# 会产生重复的三元组print("result:", temp)return temp# 排序 + 双指针
# 时间复杂度 O(n^2)
def optimize_three_nums_sum(nums: List[int]) -> List[List[int]]:n = len(nums)res = []if n < 3:return []nums.sort() # 排序  快排  O(nlogn)res = []for i in range(n):  O(n^2)if (nums[i] > 0):return resif (i > 0 and nums[i] == nums[i - 1]):   # 防止重复解continue# 双指针L = i + 1R = n - 1while (L < R):if (nums[i] + nums[L] + nums[R] == 0):res.append([nums[i], nums[L], nums[R]])# 去除重复while (L < R and nums[L] == nums[L + 1]):L = L + 1while (L < R and nums[R] == nums[R - 1]):R = R - 1L = L + 1R = R - 1elif (nums[i] + nums[L] + nums[R] > 0):R = R - 1else:L = L + 1return res

java实现
pass

 
 
[下一篇]:算法练习–leetcode 链表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/78840.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

743. 网络延迟时间

有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 ui 是源节点&#xff0c;vi 是目标节点&#xff0c; wi 是一个信号从源节点传递到目标节点的时间。 现在&#xff0c;…

用 Gaussian Process 建模 state-action 空间相关性,加速 Multi-Fidelity RL

1 intro 利用相邻 state-action 的空间相关性来加速学习&#xff1a;通过 Gaussian Process&#xff08;GP&#xff09;作为函数逼近器。主要贡献&#xff1a;两个算法。 model-based MFRL 算法 GP-VI-MFRL&#xff0c;估计转换函数&#xff0c;然后使用 value iteration 计算…

rust基础

这是笔者学习rust的学习笔记&#xff08;如有谬误&#xff0c;请君轻喷&#xff09; 参考视频&#xff1a; https://www.bilibili.com/video/BV1hp4y1k7SV参考书籍&#xff1a;rust程序设计语言&#xff1a;https://rust.bootcss.com/title-page.htmlmarkdown地址&#xff1a;h…

金鸣识别将无表格线的图片转为excel的几个常用方案

我们知道&#xff0c;金鸣识别要将横竖线齐全的表格图片转为excel非常简单&#xff0c;但要是表格线不齐全甚至没有表格线的图片呢&#xff1f;这就没那么容易了&#xff0c;在识别这类图片时&#xff0c;我们一般会使用以下的一种或多种方法进行处理&#xff1a; 1. 基于布局…

【Unity 实用工具篇】✨| 学会使用 可编程瓦片Tile Map,快速搭建2D地图

前言【【Unity 实用工具篇】✨| 学会使用 可编程瓦片Tile Map,快速搭建2D地图一、导入 Tile Map Editor二、创建调色板 Tile Palette三、快速绘制地图四、TilePalette 调色板功能介绍五、TileMap 相关组件属性介绍GirdTilemapTilemap Renderer 瓦片地图渲染器Tile Assets 瓦片…

ArcGIS Pro简介下载安装地址

ArcGIS Pro简介 ArcGIS Pro是一款功能强大的地理信息系统&#xff08;GIS&#xff09;软件&#xff0c;由Esri开发。它为用户提供了一种直观、灵活且高效的方式来处理、分析和可视化地理数据。ArcGIS Pro具有现代化的用户界面和工作流程&#xff0c;使用户能够更好地利用地理信…

【项目 计网2】4.4网络模型 4.5协议 4.6网络通信的过程

文章目录 4.4网络模型OSI七层参考模型TCP/IP四层模型&#xff08;常用&#xff09;简介四层介绍 4.5协议简介常见协议UDP协议TCP协议IP协议以太网帧协议&#xff08;MAC地址封装&#xff09;ARP协议&#xff08;IP->MAC&#xff09; 4.6网络通信的过程封装分用 4.4网络模型 …

list删除重复元素几种思路

文章目录 list删除重复元素几种思路hashsetStream流删除所有重复元素 list删除重复元素几种思路 hashset List<String> list2 new ArrayList<>();list2.add("a");list2.add("b");list2.add("a");Set<String> set new HashS…

uni-app uView自定义底部导航栏

因项目需要自定义底部导航栏&#xff0c;我把它写在了组件里&#xff0c;基于uView2框架写的&#xff08;vue2&#xff09;&#xff1b; 一、代码 在components下创建tabbar.vue文件&#xff0c;代码如下&#xff1a; <template><view><u-tabbar :value"c…

macbook 安装 Git 和 安装 Homebrew

使用MacBook 时&#xff0c;需要拉取代码&#xff0c;我们需要使用到 Git&#xff0c;但 MacBook 中并没安装&#xff0c;这里我们分享一下安装过程。其他方式可查看参考文献中的方法。 一、使用终端直接安装 在新版的 MacBook 中&#xff0c;可以使用终端直接安装 Git&#…

ensp与虚拟机搭建测试环境

1.虚拟机配置 ①首先确定VMnet8 IP地址&#xff0c;若要修改IP地址&#xff0c;保证在启动Ensp前操作 ②尽量保证NAT模式 2.ensp配置 (1)拓扑结构 (2)Cloud配置 ①首先点击 绑定信息 UDP → 增加 ②然后点击 绑定信息 VMware ... → 增加 ③最后在 端口映射设置上点击双向通…

算法练习--leetcode 链表

文章目录 合并两个有序链表删除排序链表中的重复元素 1删除排序链表中的重复元素 2环形链表1环形链表2相交链表反转链表 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。 新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&…

Axure RP9中使用Echarts示例

目录 在Axure中拖入一个矩形框&#xff0c;并命名tes 进入Echarts官网示例页面https://echarts.apache.org/examples/zh/index.html 选择自己需要的图表&#xff0c;修改数据&#xff0c;并复制左侧js代码 把上面复制的代码替换下方的option{}; javascript: var script docum…

工作记录------单元测试(持续更新)

工作记录------单元测试 之前的工作中从来没有写过单元测试&#xff0c;新入职公司要求写单元测试&#xff0c; 个人觉得&#xff0c;作为程序员单元测试还是必须会写的 于此记录一下首次编写单元测试的过程。 首先引入单元测试相关的依赖 <dependency><groupId>…

[深度学习入门]PyTorch深度学习[Numpy基础](上)

目录 一、前言二、Numpy概述三、生成Numpy数组3.1 从已有数据中创建数组3.2 利用random模块生成数组3.3 创建特定形状的多维数组3.4 利用arange和linspace函数生成数组 四、获取元素五、Numpy的算术运算5.1 对应元素相乘5.2 点积运算 六、后记 本文的目标受众&#xff1a; 对机…

改进粒子群算法优化BP神经网络---回归+分类两种案例

今天采用改进的粒子群算法(LPSO)优化算法优化BP神经网络。本文选用的LPSO算法是之前作者写过的一篇文章&#xff1a;基于改进莱维飞行和混沌映射&#xff08;10种混沌映射随意切换&#xff09;的粒子群优化算法&#xff0c;附matlab代码 文章一次性讲解两种案例&#xff0c;回归…

Maven出现报错 ; Unable to import maven project: See logs for details错误的多种解决方法

问题现象; IDEA版本&#xff1a; Maven 版本 &#xff1a; 3.3.9 0.检查 maven 的设置 &#xff1a;F:\softeware\maven\apache-maven-3.9.3\conf 检查setting.xml 配置 本地仓库<localRepository>F:\softeware\maven\local\repository</localRepository>镜像…

xLua学习

xLua教程&#xff1a;https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/XLua%E6%95%99%E7%A8%8B.md xLua配置&#xff1a;https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/configure.md FAQ&#xff1a;https://github.com/Tencent/xLua/blob/maste…

信号平滑或移动平均滤波研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…