Leetcode_双指针

167.两数之和 II - 输入有序数组


给定一个已按照升序排列的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

  • 返回的下标值(index1 和 index2)不是从零开始的。
  • 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

链接:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted

example:

输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。

解题思路

双指针,一个从小往大,一个从大往小
len():输出元素个数
return():输出结果并终止

代码

class Solution(object):
    def twoSum(self, numbers, target):
        n = len(numbers)
        i = 0
        j = n -1 
        while (i<j):
            if numbers[i] + numbers[j] == target:
                return(i+1,j+1)
            elif numbers[i] + numbers[j] > target:
                j -= 1
            else:
                i += 1

633. 平方数之和


给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。

example:

输入: 5
输出: True
解释: 1 * 1 + 2 * 2 = 5

解题思路

int():函数返回整数
math.sqrt():返回平方根
其他和T167.Two Sum一样

代码

class Solution(object):
    def judgeSquareSum(self, c):
        i = 0
        j = int(math.sqrt(c))
        while (i<=j):
            sqSum = i*i + j*j
            if sqSum == c:
                return True
            elif sqSum > c:
                j -= 1
            else:
                i += 1
        return False

345. 反转字符串中的元音字母

  • 编写一个函数,以字符串作为输入,反转该字符串中的元音字母。

解题思路

双指针,i从0开始寻找元音,j从len(s)-1开始寻找。相遇就停止。
list()函数:替换元组为列表,用于修改元素。(元组不能修改)
创造元音列表vowels,注意还有大写情况。
join()函数:以指定分隔符连接列表,元组,字符串中的元素。

代码

class Solution(object):
    def reverseVowels(self, s):
        target = list(s)
        vowels = ["a","e","i","o","u","A","E","I","O","U"]
        i = 0
        j = len(s) - 1
        while i < j :
            if target[i] not in vowels:
                i += 1
            elif target[j] not in vowels:
                j -= 1
            else:
                target[i],target[j]=target[j],target[i]
                i += 1
                j -= 1
        return "".join(target)

680. 验证回文字符串 Ⅱ


给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。

example:

输入: "aba"
输出: True

解题思路

s = s[::-1] 判断反转后与原字符串是否相同,真则直接返回
双指针法,i从左,j从右,s[i] != s[j]时有两种情况:
1.删右,判断a=s[i:j]是否为回文字符串
2.删左,判断b=s[i+1,j+1]是否为回文字符串
a or b 满足即为真,不满足即为否

注意:不要忘了s[i]=s[j]时,i,j要移位,不然无限循环报错超时。
如果i>=j就输出False

代码

class Solution(object):
    def validPalindrome(self, s):
        if s == s[::-1]:
            return True
        i,j = 0,len(s) -1
        while i < j:
            if s[i] != s[j]:
                a = s[i:j]
                b = s[i+1:j+1]
                if a == a[::-1]:
                    return True
                if b == b[::-1]:
                    return True
                return False
            else:
                i += 1
                j -= 1
        return False

88.合并有序数组


给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 num1 成为一个有序数组。

链接:https://leetcode-cn.com/problems/merge-sorted-array

example:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

输出: [1,2,2,3,5,6]

解题思路

del函数,利用数组的有序性,先从后往前把nums1的多余删除掉
append函数,将nums2元素逐个添加到nums1中
sort函数,将新nums1重新排序

代码

class Solution(object):
    def merge(self, nums1, m, nums2, n):
        for i in range(len(nums1)-1,m-1,-1):#利用nums1已经是有序的,从后往前把多余的删除
            del nums1[i]
        for i in range(len(nums2)):
            nums1.append(nums2[i])#append函数,将nums2元素逐个添加到nums1中
        return nums1.sort()#sort函数排序

141. 环形链表


给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
链接:https://leetcode-cn.com/problems/linked-list-cycle

example:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

双指针解题思路

  • 先判断head是否为空,不为空才能执行fast.next,不然报错:NoneType
  • while循环:
  • fast每次跳两格,slow每次跳一格,如果循环必然会相遇
  • fast跳两格前需验证fast.next是否为空

代码

class Solution(object):
    def hasCycle(self, head):
        if not head:#判断head是否为空
            return False
        fast,slow = head.next,head
        while fast and slow:
            if fast == slow:
                return True
            if fast.next:
                fast = fast.next.next
            else:
                return False
            slow = slow.next
        return False

列表解题思路

  • 构造列表set
  • 遍历一个元素,加add()一个
  • 利用.next迭代下一个
  • 当元素已经存在set中时,停止,return True

代码

class Solution(object):
    def hasCycle(self, head):
        #定义一个列表set()
        s = set()
        while head:
            if head in s:
                return True#如果遍历到一个元素已经存在,则有循环
            s.add(head)
            head = head.next
        return False

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值