LeetCode刷题总结-指针法

方法介绍:指针法主要使用在一组按从小到大排好序的数组中,当按照条件查找对应元素时,在数组的前后定义两个指针,当两个指针代表的元素进行运算时:若结果大于目标值,则左移右侧的指针;若结果小于目标值,则向右移动左侧指针。因为此时序列是排好序的,当大于目标值时,左侧的指针如果向右移动时得到的结果会更大,所以此时应该左移右侧的指针而右侧指针不动,反之亦然。这样做的好处是不用两次遍历数组,把O(n2)的计算复杂的转换成了O(n)的计算复杂度。当然使用这个方法的前提是这个数组是排好序的。(代表题目:1,15,16,18)

1. Two Sum

题意:给定一个整形数组和目标和target,返回数组中,两个数的和等于目标和target的下标。(输入保证只有一个合法的解)

方法:1. 暴力法(时间复杂度O(n^2)) ;2. 二分法(时间复杂度O(nlogn)); 3. 指针法

方法一:暴力法----使用两个for的嵌套循环,遍历所有可能的组合;

class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(nums)-1):
for j in range(i+1,len(nums)):
if nums[i] + nums[j] == target:
return [i,j]

方法二:二分法

class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
vis = {}
for i, num in enumerate(nums):
diff = target - num
if diff in vis:
return [vis[diff], i]
vis[num] = i

方法三:指针法

15. 3Sum

题意:给定一个数组,求所有满足条件的三个数a,b,c,使得a+b+c=0  (结果要去重)

方法:指针法枚举一个数,然后双指针,时间复杂度O(n^2),注意在查找的过程中去重。

class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
n = len(nums)
ans = []
for i in range(n-2):
if i > 0 and nums[i] == nums[i - 1]:
continue # 去重
L, R = i + 1, n - 1
while L < R:
temp = nums[i] + nums[L] + nums[R]
if temp == 0:
ans.append([nums[i], nums[L], nums[R]])
L += 1
R -= 1
while L < R and nums[L] == nums[L - 1]:
L += 1 #去重
while R > L and nums[R] == nums[R + 1]:
R -= 1 #去重
elif temp > 0:
R -= 1
else:
L += 1
return ans

18. 四数之和

题意:在一组无序数中找出四个数之和等于目标值的所有组合;

方法:枚举两个数,其余两个数使用指针法;

class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
n = len(nums)
nums.sort()
ans = []
for i in range(n - 3):
if i > 0 and nums[i] == nums[i - 1]:
continue # 去重
if nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target:
break # 条件不可能满足,退出循环
if nums[i] + nums[n - 3] + nums[n - 2] + nums[n - 1] < target:
continue # 条件不可能满足,退出循环
for j in range(i + 1, n - 2):
if j > i + 1 and nums[j] == nums[j - 1]:
continue
if nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target:
break # 条件不可能满足,退出循环
if nums[i] + nums[j] + nums[n - 2] + nums[n - 1] < target:
continue
L, R = j + 1, n - 1
while L < R:
temp = nums[i] + nums[j] + nums[L] + nums[R]
if temp == target:
ans.append([nums[i], nums[j], nums[L], nums[R]])
L += 1
R -= 1
while L < R and nums[L] == nums[L - 1]:
L += 1
while R > L and nums[R] == nums[R + 1]:
R -= 1
elif temp > target:
R -= 1
else:
L += 1
return ans

LeetCode-指针法的更多相关文章

  1. 【C语言】分别用下标法,地址法和指针法输出数组中的全部元素

    #include<stdio.h> int main() { ] = { ,,,, }; int i, * p; printf("下标法:\n"); ; i < ...

  2. Floyd 循环检测算法(快慢指针法/龟兔指针法)

    Floyd Cycle Detection Algorithm   Floyd Cycle Detection Algorithm,即 Floyd 循环检测算法,又称快慢指针法.龟兔指针法.该算法用于 ...

  3. 【Leetcode】287. 寻找重复数(数组模拟链表的快慢指针法)

    寻找重复数 根据题意,数组中的数字都在1~n之间,所以数字的范围是小于数组的范围的,数组的元素可以和数组的索引相联系. 例如:nums[0] = 1 即可以将nums[0]作为索引 通过nums[0] ...

  4. opencv学习笔记(02)——遍历图像(指针法)

    #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #include <ope ...

  5. Trees on the level(指针法和非指针法构造二叉树)

    Trees on the level Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  6. LeetCode:“剑指 Offer”

    LeetCode:"剑指 Offer" 刷题小菜鸡,花了几天时间做了一遍 LeetCode 上给出的 "剑指 Offer" 在此做一下记录 LeetCode主页 ...

  7. &lt;LeetCode OJ&gt; 141 / 142 Linked List Cycle(I / II)

    Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using ex ...

  8. leetcode bug free

    ---不包含jiuzhang ladders中出现过的题.如出现多个方法,则最后一个方法是最优解. 目录: 1 String 2 Two pointers 3 Array 4 DFS &&am ...

  9. 剑指offer刷题总结

    ★ 二维数组的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否 ...

随机推荐

  1. 【Docker】Ubuntu16.04将Docker升级至最新版

    1.使用curl升级到最新版 curl -fsSL https://get.docker.com/ | sh 2.重启Docker sudo systemctl restart docker 3.设置 ...

  2. 解决win10台式机插入耳机没有声音或者音量不大

    没有声音 如果是插入机箱的前面板,尝试切换到后面板,因为有些组装机箱的前面板是不能用的 有声音,单音量不大(注意:并不一定适用于所有情况,但是可以尝试一下) 原因:缺少驱动,可以确定下控制面板是否有这 ...

  3. MBean 描述符

    简介 Tomcat 使用 JMX MBean 来实现自身的性能管理. 每个包里的 mbeans-descriptor.xml 是针对 Catalina 的 JMX MBean 描述. 为了避免出现 “ ...

  4. LeetCode 1 Two Sum——在数组上遍历出花样

    本文始发于个人公众号:TechFlow   今天是周末,和大家一起来看一道算法题.这道题是大名鼎鼎的LeetCode的第一题,也是面试当中非常常见的一道面试题.题目不难,但是对于初学者来说应该还是很有 ...

  5. react-native-swiper使用的坑

    今天使用引入react-native-swiper组件使用轮播图时,发现报如下错误: Invarint Violation:ViewPagerAndroid has been removed from ...

  6. 004 ceph存储池

    介绍:前面已经使用deploy和ansble部署了ceph集群,现在对集群的池进行简单介绍和简单操作 一.部分概念 池是ceph存储集群的逻辑分区,用于存储对象 对象存储到池中时,使用CRUSH规则将 ...

  7. 【阿里云IoT+YF3300】10.快速开发188协议设备驱动

    188协议的全称为CJ-T188-2004 <户用计量仪表数据传输技术条件>,是针对水表.燃气表.热量表和其他集中采集的一个国家行业标准协议. YFIOs就是YFSoft I/O Serv ...

  8. vue-router学习之二

    本文的学习来自技术胖大神的教程:https://jspang.com/ 这里的路由是指SPA(单页应用)的路径管理器.vue-router就是WebApp的链接路径管理系统. 为什么不能直接用< ...

  9. 洛谷$P3226\ [HNOI2012]$集合选数 状压$dp$

    正解:$dp$ 解题报告: 传送门$QwQ$ 考虑列一个横坐标为比值为2的等比数列,纵坐标为比值为3的等比数列的表格.发现每个数要选就等价于它的上下左右不能选. 于是就是个状压$dp$板子了$QwQ$ ...

  10. 【C++】递归 课后习题3-13、3-14

    // // main.cpp // 3-13递归Fibonacci级数 // // Created by T.P on 2018/3/21. // Copyright © 2018年 T.P. All ...