首页 > 其他分享 >5 双指针

5 双指针

时间:2023-07-24 16:13:53浏览次数:28  
标签:剪枝 nums 链表 num 字符串 指针

双指针

1 数组-移除元素

题目:

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。

示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

你不需要考虑数组中超出新长度后面的元素。

思路:

快指针f慢指针s,当检测到需要删除的元素时,s停止一步,f前进一步,且将s下标赋值为f,做逻辑删除,最后resize到s下标大小即可

2 字符串-反转字符串Ⅱ

题目:

反转字符串

思路:

for循环,双指针,一个指向头,一个指向尾,做swap,停止条件为左指针大于右指针

3 字符串-替换空格

题目:

替换字符串s中的空格为指定字符串j

思路:

第一个for循环,检测字符串中的空格数量,然后resize字符串,扩充至需要的长度,第二个for循环,双指针,快指针指向resize后的字符串末尾,慢指针指向old指针的字符串末尾,当慢指针检测到空格时,反向赋值j,终止条件为指针=0

4 字符串-翻转字符串里的单词

题目:

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

思路:

首先去除多余空格,然后先将整个字符串翻转,在for循环,双指针,快慢指针初始值都为0,快指针++,检测到空格时就反转快慢指针之间的部分字符,注意最后快指针到末尾时再反转最后一个单词。

5 链表-反转链表

题目:

题意:反转一个单链表。

思路:

快慢指针,挨个反转,注意定义tmp指针进行保存下一个节点即可

6 链表-删除链表的倒数第N个节点

题目:

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

要求:使用一趟扫描实现

思路:

快慢指针,快指针比慢指针快n,当快指针走到最后一个结点时,删除慢指针指向节点即可实现一个循环删除

7 链表-链表相交

题目:

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

思路:

如果相交说明在某一个节点之后两个单链表完全相同,将较长的链表定位到倒数较短链表长度位置,判断是否相同(注意不只是val值相等),相同则相交了

8 链表-环形链表Ⅱ

题目:

题意: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

为了表示给定链表中的环,使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

思路:

快指针每次走两步,慢指针每次走一步,当快指针追上慢指针就说明有环,当相遇时,重新设置两个指针,一个指向头节点,一个指向相遇的节点,两个节点相遇的节点就是入环的第一个节点

8 哈希表-三数之和

题目:

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

思路:

先sort冒泡排序将nums转换为有序数组,for循环,i从0开始,左指针从i开始,右指针从nums.size()-1开始,令i,左指针,右指针下标数字为num_i,num_l,num_r。当num_i+num_l+num_r小于0,则左指针右移;若大于0,则右指针左移;若=0,则保存一个三元组,并且左指针右移,右指针左移,此时还要执行剪枝1。

  • 剪枝1:若num_l或者num_r相邻值相等,continue,
  • 剪枝2:若num_i大于0,break,return保存的三元组
  • 剪枝3:num_i若和num_(i-1)相同则continue,这样处理是因为可以有i和left相等的情况。

8 哈希表-四数之和

题目:

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c,d ,使得 a + b + c + d = 0 ?请你找出所有满足条件且不重复的三元组。

思路:

在三数之和的基础上多一个for循环,即i,j,left,right,此时剪枝需要稍作改变,

  • 剪枝1:若num_l或者num_r相邻值相等,continue,

  • 剪枝2:若num_i大于0,break,return保存的三元组

  • 剪枝3:i>1且num_i若和num_(i-1)相同则continue,这样处理是因为可以有i和left相等的情况。

  • 剪枝4:j>i+1且num_j若和num_(j-1)相同则continue,这样处理是因为可以有i和left相等的情况。

  • 剪枝5:i>=j时continue

标签:剪枝,nums,链表,num,字符串,指针
From: https://www.cnblogs.com/mobbu/p/17577482.html

相关文章

  • 09_指针提高
    指针提高二维数组详解intarr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};arr===>二维数组第0行地址===>arr[0]arr+1===>二维数组第一行地址===>arr[1]*(arr)===>第0行第0列地址===>arr[0][0]*(arr+1)+1===>第1行第1列地址===>arr[1][1]arr[......
  • C语言指针的常见问题
    1值传递下面看一个列子,student结构体中包含该学生的各种信息,我们在change函数中对其进行部分修改,再在主函数中输出其结果#include<stdio.h>#include<string.h>#defineformat"%d\n%s\n%f\n%f\n%f\n"structstudent{intnum;charname[20];floatscore[3]......
  • 11.数组名和指针(这⾥为指向数组⾸元素的指针)区别
    1intmain()2{3inta[2]={1,2};4int*p=a;5cout<<"a+1"<<a+1<<endl;6cout<<"p+1"<<p+1<<endl;7cout<<"*(a+1)"<<*(a+1......
  • python 调用 c api 怎么 传入 指针
    Python调用CAPI如何传入指针Python是一种高级编程语言,但有时需要使用底层的C语言来进行更高性能的操作。Python提供了CAPI,允许我们编写C代码并在Python程序中调用。在这种情况下,我们可能需要将指针传递给C函数,以便在C代码中进行操作。本文将介绍如何在Python中调用CAPI时传递指......
  • 3.数组与指针(a和&a)的区别
    定义一个数组:inta[4]={0,1,2,3};a是数组名,它是数组的首地址,a+1表示第二个元素的地址,*(a+1)=a[1]。定义两个指针:int(*p)[4]=&a;这说明&a和int(*p)[4]一样都是int(*)[4]类型表示指向数组的指针,&a+1,p+1操作后两者就指向了数组的尾后元素,注意不能解引用int*p=a;这说明a和int*......
  • 08_指针
    指针内存的概述在32位平台,每一个进程有4G的空间系统为内存的每一个字节分配一个32位的地址编号指针变量的定义定义步骤-*修饰指针变量p保存谁的地址就先定义谁指针变量的详解在32位平台任何类型的指针变量都是4字节在64位平台位8字节p====>变量地址*p===>变......
  • 智能指针初探
    智能指针是C++11引入的,比裸指针更为强大的指针。主要作用是用来完成一定程度上的内存资源管理自动化。unique_ptrunique_ptr实现专属所有权功能。unique_ptr不允许拷贝,只允许移动,保证了没有其他的指针指向unique_ptr指向的对象。unique_ptr被析构时,其析构函数会主动析构所指向的......
  • 关于this指针你知道多少?
    JavaScript中的this指针是一个非常重要且常见的概念。理解this指针的原理、优缺点和应用场景对于编写高效且健壮的JavaScript代码至关重要。本文将深入探讨this指针的相关内容。一、this指针的原理在JavaScript中,this是一个特殊的关键字,它在函数内部使用,用于指向调用该函数的对......
  • 逛画展(双指针)
    #逛画展##题目描述博览馆正在展出由世上最佳的$m$位画家所画的图画。游客在购买门票时必须说明两个数字,$a$和$b$,代表他要看展览中的第$a$幅至第$b$幅画(包含$a,b$)之间的所有图画,而门票的价钱就是一张图画一元。Sept希望入场后可以看到所有名师的图画。当然,他想最小......
  • golang 重塑切片指针接口
    result*[]xxx  1.判断接口是否为空   2.构造新指针类型,并赋值空切片ifreflect.ValueOf(result).Elem().IsNil(){resultType:=reflect.TypeOf(result).Elem()t2:=reflect.New(resultType)t3:=t2.Elem()t3.Set(reflect.......