• 双指针应用一:碰撞指针


    1、翻转数组中的元素:s = ['l', 'e', 'e', 't', 'c', 'o', 'd', 'e']

    算法思路:定义左指针 i=0, 右指针 r = len(s)-1。交换指针对应的元素,然后同时向中间移动指针,直到指针碰撞。在指针移动的同时,交换指针指代的元素。

    def reverseStr(s):
        l=0
        r=len(s)-1
        while l<r:
            s[l],s[r]=s[r],s[l]
            l+=1
            r-=1
        return s
    
    s = ['l', 'e', 'e', 't', 'c', 'o', 'd', 'e']
    print(reverseStr(s))

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

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

         算法思路:定义左指针 l=0, 右指针 r=len(nums)-1 。计算两个指针指代的元素之和:sum=nums[l]+nums[r]。如果sum<target,向中间移动左指针;如果sum>target,

       右指针向左边移动。直到sum==target,返回 [l+1,r+1]。

    def twoSum(nums,target):
        l=0
        r=len(nums)-1
        while l<r:
            sum=nums[l]+nums[r]
            if sum>target:
                r-=1
            elif sum<target:
                l+=1
            else:
                return (l+1,r+1)
                
            
    nums=[2, 7, 11, 15]
    target=9
    print(twoSum(nums,target))

     3、验证回文字符串。给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

      输入: "A man, a plan, a canal: Panama" 输出: true
    算法思路:初始化左指针 l=0,右指针 r=len(s)-1.判断左右指针指代的元素是否为字母或数字。如果不是,左、右指针向中间移动。1如果指代元素为字母或数字;
    判断左、右指针指代元素是否相等。如果不等,返回False。如果相等,左右指针向中间移动,判断下一个元素是否相等。
    def isPalindrome(s):
        n=len(s)
        l=0
        r=n-1
        while l<r:
            if s[l].isalnum()==False:
                l+=1
                continue
            if s[r].isalnum()==False:
                r-=1
                continue
            if s[l].lower()!=s[r].lower():
                return False
            l+=1
            r-=1
        return True
    
    s="A man, a plan, a canal: Panama"
    print(isPalindrome(s))

    4、翻转字符串元音字母。输入: "hello"  输出: "holle"。算法思路类似于题3.

    def reverseVowels(s):
        s=list(s)
        res = ['a', 'e', 'i', 'o', 'u', 'A','E','I','O','U']
        l=0
        r=len(s)-1
        while l<r:
            if s[l] not in res:
                l+=1
                continue
            if s[r] not in res:
                r-=1
                continue
            if (l<r):
                s[l],s[r]=s[r],s[l]
            l+=1
            r-=1
        return "".join(s)
    
    
    s="hello"
    print(reverseVowels(s))

    5、 盛最多水的容器。给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (iai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (iai) 和 (i, 0)。找出其中的两条           线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

    def maxArea(height):
        l=0
        r=len(height)-1
        #初始化面积
        area=0
        while l<r:
            if height[l]<=height[r]:
                area=max(area,(r-l)*height[l])
                l+=1
            if height[l]>height[r]:
                area=max(area,(r-l)*height[r])
                r-=1
        return area
    
    
    height=[1,8,6,2,5,4,8,3,7]
    print(maxArea(height))

          

    
    
    
  • 相关阅读:
    独木舟上的旅行
    会场安排问题
    喷水装置(二)
    喷水装置(一)
    款待奶牛
    整理书本
    贪心算法基本思想和典型例题(转)
    贪心算法
    太乱了,不要了
    Runtime Error:Floating point exception 不知道拿错了
  • 原文地址:https://www.cnblogs.com/yijierui/p/13276921.html
Copyright © 2020-2023  润新知