算法(6)-leetcode-explore-learn-数据结构-数组字符串的双指针技巧

leetcode-explore-learn-数据结构-数组4-双指针技巧

  • 1.双指针技巧--适用情形1
    • 1.1概述
    • 1.2 例题
      • 1.2.1 反转字符串
      • 1.2.2数组拆分
      • 1.2.3 两数之和2
  • 2双指针技巧-适用情形2
    • 2.1概述
    • 2.2例题
      • 2.2.1 移除元素
      • 2.2.2 最大连续1的个数
      • 2.2.3长度最小的子数组

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

所有例题的编程语言为python
在一般的数组问题中,我们只采用从第一个元素开始到最后一个元素结束的一个指针来进行迭代。

有些时候需要用两个指针来迭代数组

1.双指针技巧–适用情形1

1.1概述

最简单的例题–反转数组中的元素(利用连个指针来完成迭代,一个指针从第一个元素开始,另一个指针从末尾开始,持续交换他们所指向的元素,直至俩个指针相遇)
双指针技巧的经典应用场景之一:从两端向中间迭代数组,这个技巧经常在排序的数组中使用

1.2 例题

1.2.1 反转字符串

原地修改给定的输入字符串数组
数据格式:

输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]

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

1.2.2数组拆分

给定长度为2n的数组,将这些数字分为n对,例如(a1,b1),(a2,b2),...,(an,bn)(a_1,b_1),(a_2,b_2),...,(a_n,b_n)(a1,b1),(a2,b2),...,(an,bn),使得从1-n的min(ai,bi)min(a_i,b_i)min(ai,bi)总和最大。

举例:a1,a2,a3,a4,a5,a6a_1,a_2,a_3,a_4,a_5,a_6a1,a2,a3,a4,a5,a6升序排列
6个数分三对,能出现在和计算式中的最大数为a5a_5a5(此时a5和a6a_5和a_6a5a6配对),同理剩下的4个数中,依次出现在和式中的为a1,a3a_1,a_3a1,a3

解题思路:先对数组排序,然后依次叠加偶数索引元素。

class Solution(object):def arrayPairSum(self, nums):""":type nums: List[int]:rtype: int"""n=len(nums)res=0# nums.sort()for i in range(n):if i%2==0:res+=nums[i]return res

1.2.3 两数之和2

给定一个按升序排列的有序数组,找到两个数字使得他们相加的和等于目标数
返回两个数字的下标,index1<index2(索引下标从1开始)
一个输入只有一对答案,不能重复使用个数组中的元素。

双指针求解:
if (nums[i]+nums[j]==target): return(i+1,j+1)
if(nums[l]+nums[r]>target):r-=1
if(nums[l]+nums[r]<target):l+=1

class Solution(object):def twoSum(self, numbers, target):""":type numbers: List[int]:type target: int:rtype: List[int]"""l=0r=len(numbers)-1while(l<r):if numbers[l]+numbers[r]==target:return [l+1,r+1]if numbers[l]+numbers[r]<target:l+=1if numbers[l]+numbers[r]>target:r-=1return  -1

2双指针技巧-适用情形2

2.1概述

适用快慢两个不同步的指针来解决问题。

经典问题:给定一个数组和一个值,原地删除该值的所有实例并返回新的长度。空间复杂度要求–原地操作
思路1:快指针用于迭代遍历数组,慢指针用于指向下一次添加的位 置。

2.2例题

2.2.1 移除元素

题目如概述中

class Solution(object):def removeElement(self, nums, val):""":type nums: List[int]:type val: int:rtype: int"""n=len(nums)j=0for i in range(n):if nums[i]!=val:nums[j]=nums[i]j+=1return j

2.2.2 最大连续1的个数

给定一个二进制数组,计算其中最大连续1的个数。
k,m=0,0
快指针遇到1一直加,直至遇到0,统计一下当前1的个数,更新慢指针的位置。
慢指针指向连续1的开头,快指针指向连续1的结尾。
当快指针遇到0之后,统计一下结果。当遇到下一个1时慢指针才更新。

class Solution(object):def findMaxConsecutiveOnes(self, nums):""":type nums: List[int]:rtype: int"""n=len(nums)count=0max_count=0for i in range(n):if nums[i]==1:count+=1if nums[i]==0:max_count=max(max_count,count)count=0return max(max_count,count)               

2.2.3长度最小的子数组

给定一个含有n个正整数的数组和一个正整数s,找出该u数组中满足其和》=s的长度最小的子数组,并返回其长度。如果不存在符合条件的连续子数组,返回0.

子数组是一个连续的序列
解法1-暴力法

class Solution(object):def minSubArrayLen(self, s, nums):""":type s: int:type nums: List[int]:rtype: int"""n=len(nums)res=n+1for i in range(n):temp=0for j in range(i,n):temp+=nums[j]if temp>=s:res=min(res,j-i+1)break#print (res)if res==n+1:return 0else:return res

解法2-双指针
以上思路是保持子数组的左端点不动,去寻找右端点。其实一旦知道这个位置开始的子数组不是最优答案,我们就可以移动左端点。使用两个指针,一个指向数组的开始位置,一个指向数组的最后位置。维护区间内的和>=s,且长度最小。

class Solution(object):def minSubArrayLen(self, s, nums):""":type s: int:type nums: List[int]:rtype: int"""n=len(nums)res=n+1temp_sum=0left=0for i in range(n):temp_sum+=nums[i]while(temp_sum>=s):res=min(res,i-left+1)temp_sum-=nums[left]left+=1#print (res)if res==n+1:return 0else:return res

(2.2.1 和2.2.3例题的双指针技巧都解的不充分。

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

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

相关文章

POSIX和SYSTEM的消息队列应该注意的问题

首先看看POSIX的代码&#xff1a; 1.posix_mq_server.c #include <mqueue.h> #include <sys/stat.h> #include <string.h> #include <stdio.h> #define MQ_FILE "/mq_test" #define BUF_LEN 128 int main() { mqd_t mqd; char b…

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

leetcode-explore-learn-数据结构-数组5-小结1.概述2.例题2.1旋转数组2.2 杨辉三角22.3翻转字符串里的单词2.4反转字符串中的单词32.5 删除排序数组中的重复项2.6 移动零本系列博文为leetcode-explore-learn子栏目学习笔记&#xff0c;如有不详之处&#xff0c;请参考leetcode官…

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等。 这种攻击方式是…