力扣-数组-双指针

题目顺序

27移除元素,26删除有序数组中的重复项,283移动零,844比较含退格的字符串,977有序数组的平方

解题思路

1.确定双指针,一个遍历数组,一个确定新数组元素

2.确定循环终止的条件一般是left<=right,具体根据实例判断

 

 

 

 

 1 class Solution(object):
 2     def removeElement(self, nums, val):
 3         """
 4         :type nums: List[int]
 5         :type val: int
 6         :rtype: int
 7         """
 8         # 双指针法,left从前往后定位val,right从后往前把非val换到left指向的val位置
 9         left = 0
10         right = len(nums)-1
11         while(left<right):# 还没遍历完数组时进入循环
12             if nums[left]==val:
13                 if nums[right]!=val:
14                     nums[left] = nums[right]
15                     left += 1
16                     right -= 1
17                 else: 
18                     right -= 1
19             else: 
20                 left += 1
21         # 判断跳出循环时,left和right的大小关系,返回left相关
22         # left指向要保留
23         if left==right and val!=nums[left]:
24             return left+1
25         # right<left或left==right,nums[left]==val,删除
26         else:
27             return left

 

 

 

 

 

 1 class Solution(object):
 2     def removeDuplicates(self, nums):
 3         """
 4         :type nums: List[int]
 5         :rtype: int
 6         """
 7         left, p = 0, 0
 8         # 指针p指向新数组中确定的元素,指针left遍历整个数组;
 9         right = len(nums)-1
10         while(left<=right):
11         # 如果left指向与新数组的p相同时,继续遍历,定p动left
12             if nums[p]==nums[left]:
13                 left += 1
14             else:
15         # 如果left指向与新数组的p不一致时,更新p+1所在,p++
16                 nums[p+1] = nums[left]
17                 p += 1
18         return p+1

 

 

 

 1 class Solution(object):
 2     def moveZeroes(self, nums):
 3         """
 4         :type nums: List[int]
 5         :rtype: None Do not return anything, modify nums in-place instead.
 6         """
 7         # 双指针法
 8         pos = 0
 9         left = 1
10         right = len(nums)-1
11         while(left<=right):
12             if nums[pos]==0 and nums[left] != 0:
13                 nums[pos] = nums[left]
14                 nums[left] = 0
15                 pos += 1
16                 left += 1
17             elif nums[pos]==0 and nums[left] == 0:
18                 left += 1
19             elif nums[pos] != 0:
20                 pos += 1
21                 left += 1
22         return pos

# 常规的双指针法解题,注意终止条件,if语句和返回值。

 

 

 

 1 class Solution(object):
 2     def backspaceCompare(self, s, t):
 3         """
 4         :type s: str
 5         :type t: str
 6         :rtype: bool
 7         """
 8         # 理解题目,要删除#和它之前相同个数的字符
 9         s = list(s)
10         pos = 0
11         left = 0
12         right = len(s)-1
13         while (left <= right):
14             if pos<0:# 退格多于字符
15                 pos = 0
16             if s[left]=='#':# 继续遍历
17                 pos -= 1
18                 left += 1
19             else:# 删掉一个元素
20                 s[pos] = s[left]
21                 pos += 1
22                 left += 1
23         ss = ''.join(s[:pos])
24 
25         t = list(t)
26         pos = 0
27         left = 0
28         right = len(t)-1
29         while (left <= right):
30             if pos<0:
31                 pos = 0
32             if t[left]!='#':
33                 t[pos] = t[left]
34                 pos += 1
35                 left += 1
36             else:
37                 pos -= 1
38                 left += 1
39         tt = ''.join(t[:pos])
40         return ss==tt
41 
42         

# 对字符串s而言,left指针用来遍历整个字符串,pos指针用来获取新字符串的内容;

# 当left不指向'#'时,对pos赋值;指向'#'时,pos退格,left前进。

 

 

 

class Solution(object):
    def sortedSquares(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        # 双指针法,与直接排序的不同是,数组正负两端是有序的,所以可以一左一右一次比较
        i, j, pos = 0, len(nums)-1, len(nums)-1
        res = [0]*len(nums)
        while(i<=j):
            if nums[i]*nums[i]<nums[j]*nums[j]:
                res[pos] = nums[j]*nums[j]
                j -= 1
                pos -= 1
            else:
                res[pos] = nums[i]*nums[i]
                i += 1
                pos -= 1
        return res

# 因为原始数组正负两端是各自有序的,所以可以双指针,左右依次比较;

# 后续要用直接插入排序和快排做一下。

posted @ 2023-03-29 11:23  Yalking  阅读(33)  评论(0)    收藏  举报