算法(7)-leetcode-explore-learn-数据结构-数组-小结

leetcode-explore-learn-数据结构-数组5-小结

  • 1.概述
  • 2.例题
    • 2.1旋转数组
    • 2.2 杨辉三角2
    • 2.3翻转字符串里的单词
    • 2.4反转字符串中的单词3
    • 2.5 删除排序数组中的重复项
    • 2.6 移动零

本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode官网:https://leetcode-cn.com/explore/learn/card/array-and-string/198/introduction-to-array/768/

所有例题的编程语言为python

1.概述

1.数组的常用排序算法及其时间复杂度分析十分重要
2.二分查找是一种十分重要的技术,用于在排序数组中搜索特i定元素
3.灵活应用双指针技巧十分重要,双指针技可以应用于:链表中快慢指针问题,滑动窗口问题

2.例题

2.1旋转数组

给定一个数组,将数组中的元素向右移动K个位置,其中k为非负数。
空间复杂度:o(1)
思路1:三次求逆:先整体求逆,然后nums[0,k]求逆,然后再nums[k+1:]求逆

class Solution(object):def rotate(self, nums, k):""":type nums: List[int]:type k: int:rtype: None Do not return anything, modify nums in-place instead."""def rever_nums(nums,l,r):  # 原地置换,用index操作,nums[:flag]只是一个备份,没有修改元数组while(l<r):nums[l],nums[r]=nums[r],nums[l]l+=1r-=1n=len(nums)flag=k%nrever_nums(nums,0,n-1)rever_nums(nums,0,flag-1)rever_nums(nums,flag,n-1)return nums  

思路2:计算每个数组移动到的目标位置,将目标位置的信息记录下来作为下一个操作的对象(30/35)—[-1,-100,3,99]2测试用例没过.

class Solution(object):def rotate(self, nums, k):""":type nums: List[int]:type k: int:rtype: None Do not return anything, modify nums in-place instead."""n=len(nums)action=0index=0current_val=nums[0]while(action<=n):target_index=(index+k)%ntarget_val=nums[target_index]nums[target_index]=current_valaction+=1index=target_indexcurrent_val=target_valreturn nums    

修正思路:环装替换法

参考官网解题思路:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/

思路3,暴力法,每次移动一个,移动k次
(34/35)时间超出限制

class Solution(object):def rotate(self, nums, k):""":type nums: List[int]:type k: int:rtype: None Do not return anything, modify nums in-place instead."""n=len(nums)flag=k%nfor i in range(flag):current=nums[n-1]for j in range(n):  # j:[0,n-1]temp=nums[j]nums[j]=currentcurrent=tempreturn nums

2.2 杨辉三角2

返回杨辉三角的第k行,算法空间复杂度,o(k)

思路1:计算整个杨辉三角,返回最后一行

class Solution(object):def getRow(self, rowIndex):res=[]for i in range(rowIndex+1): # i:[0,rowIndex]  rowIndex+1行if i==0:res.append([1])elif i==1:res.append([1,1])else:res.append([1]*(i+1))for j in range(1,i):res[i][j]=res[i-1][j-1]+res[i-1][j]return res[-1]

思路2:空间复杂度优化,只有上一行计算下一行:

class Solution(object):def getRow(self, rowIndex):if rowIndex==0:return [1]if rowIndex==1:return [1,1]pre=[1,1]for i in range(2,rowIndex+1):cur=[1]*(i+1)for j in range(1,i):cur[j]=pre[j-1]+pre[j]pre=curreturn cur

2.3翻转字符串里的单词

给定一个字符串,逐个翻转字符串中的每个单词

**思路1:**要识别字符串中的每个单词,然后调整顺序。从最后开始遍历,识别一个单词后,往结果中添加。

class Solution(object):def reverseWords(self, s):""":type s: str:rtype: str"""res =""n=len(s)flag=0     # 判断是否开始识别一个单词for i in range(n-1,-1,-1):#print(i,s[i],flag)if s[i]!=" " and flag==0: # 一个单词的起始flag=1right=il_word=1elif s[i]!=" " and flag==1: # 单词左下标往前走l_word+=1elif s[i]==" " and flag==1: # 单词左下标走到了边界word=s[right-l_word+1:right+1]flag=0res+=wordres+=" "elif s[i]==" " and flag==0:  # 多个空格的时候continueif flag==1:                      #最后还需要判断是否还有一个单词word=s[right-l_word+1:right+1]flag=0res+=wordlen_res=len(res)if len_res==0:return ""if res[-1]==" ":res=res[0:-1]return res

思路2:借助内置的函数
split() 将字符串按空格分成字符串数组
reverse() 将字符串数组翻转
join 将字符串数组拼接鞥一个字符串。

class Solution(object):def reverseWords(self, s):""":type s: str:rtype: str"""s_arr=s.split()s_arr.reverse()res=" ".join(s_arr)return res

2.4反转字符串中的单词3

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
思路:识别一个单词,送去翻转,添加至结果后

class Solution(object):def reverseWords(self, s):""":type s: str:rtype: str"""def rever_word(word):n=len(word)re_word=""for i in range(n-1,-1,-1):re_word+=word[i]#print(re_word)return re_wordn=len(s)l,r=0,0res=""while(r<n):if s[r]!=" ":r+=1elif s[r]==" ":word=s[l:r]res+=rever_word(word)res+=" "l=r+1r+=1word=s[l:r+1]res+=rever_word(word)return res   

2.5 删除排序数组中的重复项

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
**思路:**快慢指针:慢指针用于指示下一个写数字的位置,快指针用于遍历数组。每次判断快指针指向的数字在数组是否重复出现,如果重复出现就下一个,如果不是重复出现就更新慢指针的数值。

class Solution(object):def removeDuplicates(self, nums):""":type nums: List[int]:rtype: int"""n=len(nums)l=0target="INF"for r in range(n):if nums[r]!=target:target=nums[r]nums[l]=nums[r]l+=1         #指示下一个可以写的位置return l         

2.6 移动零

给定一个数组,编写程序,完成将所有的零移动至数组的末尾,其他元素相对位置不变。
要求:原地操作,尽量少的操作次数
暴力求解思路:每次移动一个0.时间复杂度o(n^2)

class Solution(object):def moveZeroes(self, nums):""":type nums: List[int]:rtype: None Do not return anything, modify nums in-place instead."""n=len(nums)i=0j=n-1while(i<n and i<j): # print(i,j,nums)if nums[i]==0:  # 置换完i不是立即+1,换完nums[i]处还可能是1for k in range(i,j):nums[k],nums[k+1]=nums[k+1],nums[k]j-=1else:i+=1     return nums

思路2双指针技巧:慢指针之前的元素都是非零,快指针与慢指针之间的元素都是0

class Solution(object):def moveZeroes(self, nums):""":type nums: List[int]:rtype: None Do not return anything, modify nums in-place instead."""n=len(nums)i,j=0,0while(i<n):if nums[i]:nums[i],nums[j]=nums[j],nums[i]j+=1i+=1

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

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

相关文章

fcntl函数详解

功能描述&#xff1a;根据文件描述词来操作文件的特性。 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock *lock); [描述] fcntl()针对(文件)描述符提供控…

使用nohup让程序永远后台运行

使用nohup让程序永远后台运行 Unix/Linux下一般比如想让某个程序在后台运行&#xff0c;很多都是使用 & 在程序结尾来让程序自动运行。比如我们要运行mysql在后台&#xff1a; /usr/local/mysql/bin/mysqld_safe --usermysql &但是加入我们很多程序并不象mysqld一样做…

算法(8)-leetcode-explore-learn-数据结构-链表

leetcode-explore-learn-数据结构-链表11.概述1.1 链表插入操作1.2 链表删除操作2.设计链表本系列博文为leetcode-explore-learn子栏目学习笔记&#xff0c;如有不详之处&#xff0c;请参考leetcode官网&#xff1a;https://leetcode-cn.com/explore/learn/card/linked-list/所…

Mysql索引优化实例讲解

MYSQL描述&#xff1a;一个文章库&#xff0c;里面有两个表&#xff1a;category和article。category里面有10条分类数据。article里面有20万条。article里面有一个"article_category"字段是与category里的"category_id"字段相对应的。article表里面已经把…

给自己的VIM配置

编辑 .vimrc 文件如下&#xff1a; filetype plugin on "autocmd Filetype cpp,c,java,cs set omnifunccppcomplete#Complete set nu set nocp set nobackup let g:C_AuthorName gaoke let g:C_AuthorRef gaoke let g:C_Email gaoketaomee.…

shell一文入门通

简单来说“Shell编程就是对一堆Linux命令的逻辑化处理”。 W3Cschool 上的一篇文章是这样介绍 Shell的 hello world 学习任何一门编程语言第一件事就是输出HelloWord了&#xff01;下面我会从新建文件到shell代码编写来说下Shell 编程如何输出Hello World。 (1)新建一个文件…

算法(9)--两个数的最大公约数

两个数的最大公约数1.辗转相除法求解两个数的最大公约数2.更相减损术求解两个数的最大公约数3.不严格理解1.辗转相除法求解两个数的最大公约数 辗转相除法&#xff1a;两个正整数a和b&#xff08;a>b&#xff09;的最大公约数等于a除以b的余数与b 之间的最大公约数。–如果…

RPC编程

图 3 说明在客户机和服务器之间完成 RPC 涉及的步骤。 图 3. 在客户机和服务器之间完成 RPC 涉及的步骤服务器 RPC 应用程序初始化期间它会向 RPC 运行时库注册接口。需要注册接口是因为&#xff0c;客户机在向服务器发出远程过程调用时&#xff0c;要检查它是否与服务器兼容。…

synchronized使用和原理全解

synchronized是Java中的关键字&#xff0c;是一种同步锁。它修饰的对象有以下几种&#xff1a; 修饰一个方法 被修饰的方法称为同步方法&#xff0c;其作用的范围是整个方法&#xff0c;作用的对象是调用这个方法的对象&#xff1b; 修饰一个静态的方法 其作用的范围是整个…

RPC学习笔记

在查看libc6-dev软件包提供的工具&#xff08;用 dpkg -L libc6-dev 命令&#xff09;的时候&#xff0c;发现此软件包提供了一个有用的工具rpcgen命令。通过rpcgen的man手册看到此工具的作用是把RPC源程序编译成C语言源程序&#xff0c;从而轻松实现远程过程调用。下面的例子程…

算法(10)-leetcode-explore-learn-数据结构-链表双指针技巧

leetcode-explore-learn-数据结构-链表21.概述2.例题2.1 环形链表判断2.2 环形链表22.3 相交链表2.4 删除链表的倒数第N个节点3.小结本系列博文为leetcode-explore-learn子栏目学习笔记&#xff0c;如有不详之处&#xff0c;请参考leetcode官网&#xff1a;https://leetcode-cn…

一个简单的游戏服务器框架

最近看到百度空间的一个帖子&#xff0c;不错&#xff0c;在这里整理下&#xff0c;转载至我的博客里&#xff0c;开始自己慢慢琢磨写一个框架。 我先从上层结构说起&#xff0c;一直到实现细节吧&#xff0c;想起什么就写什么。 第一部分 服务器逻辑 服务器这边简单的分为三…

堆和栈的精华大总结

Java内存分配原理 栈、堆、常量池虽同属Java内存分配时操作的区域&#xff0c;但其适用范围和功用却大不相同。 一般Java在内存分配时会涉及到以下区域&#xff1a; ◆寄存器&#xff1a;我们在程序中无法控制 ◆栈&#xff1a;存放基本类型的数据和对象的引用&#xff0c;但…

算法(11)-leetcode-explore-learn-数据结构-链表的经典问题

leetcode-explore-learn-数据结构-链表31.反转一个链表2.移除链表元素3.奇偶链表4.回文链表5.小结本系列博文为leetcode-explore-learn子栏目学习笔记&#xff0c;如有不详之处&#xff0c;请参考leetcode官网&#xff1a;https://leetcode-cn.com/explore/learn/card/linked-l…

探索式软件测试

James A.Whittaker [美] 詹姆斯惠特克&#xff08;软件测试领域绝对的大师&#xff09;著作《Exploratory Software Testing》&#xff0c;中文名《探索式软件测试》&#xff0c;记得当时被这本书深深吸引啦&#xff08;我不知道有多少做测试的小伙伴看过这本书&#xff09;&am…

Linux线程池的设计

我设计这个线程池的初衷是为了与socket对接的。线程池的实现千变万化&#xff0c;我得这个并不一定是最好的&#xff0c;但却是否和我心目中需求模型的。现把部分设计思路和代码贴出&#xff0c;以期抛砖引玉。个人比较喜欢搞开源&#xff0c;所以大家如果觉得有什么需要改善的…

算法(12)-leetcode-explore-learn-数据结构-双链表的设计

leetcode-explore-learn-数据结构-链表4双链表的设计本系列博文为leetcode-explore-learn子栏目学习笔记&#xff0c;如有不详之处&#xff0c;请参考leetcode官网&#xff1a;https://leetcode-cn.com/explore/learn/card/linked-list/所有例题的编程语言为python 双链表的设…

安全方面知识

什么是文件上传漏洞 文件上传漏洞是指 由于程序员在对用户文件上传部分的控制不足或者处理缺陷&#xff0c;而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件 这里上传的文件可以是木马&#xff0c;病毒&#xff0c;恶意脚本或者WebShell等。 这种攻击方式是…

CE游戏外挂工具

CHEAT ENGINE(以下简称CE)是我见过的最优秀的游戏作弊工具。它的优点多不胜数&#xff0c;虽然单独从搜索游 戏里面的数值来说&#xff0c;它并不比其他同类软件强多少&#xff0c;但它不仅仅是个游戏修改工具&#xff0c;它还有其他游戏修改软件所没有的一些特点&#xff0c;例…

外挂编程-动作模拟技术

几乎所有的游戏都有大量繁琐和无聊的攻击动作以增加玩家的 功力,还有那些数不完的迷宫,这些好像已经成为了角色游戏的代名词。现在,外挂可以帮助玩家从这些繁琐而无聊 的工作中摆脱出来。 1. 鼠标模拟技术 几乎所有的游戏中都使用了鼠标来改变角色的位置和方向,玩家仅用…