75. 颜色分类&&面试题 02.04. 分割链表

    科技2024-03-17  102

    给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

    此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

    注意: 不能使用代码库中的排序函数来解决这道题。

    示例:

    输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2]

    进阶:

        一个直观的解决方案是使用计数排序的两趟扫描算法。     首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。     你能想出一个仅使用常数空间的一趟扫描算法吗?

    1.三指针,首末指向0和2,第3个指针遍历数组,当遇到0和第一个交换,当遇到2和第二个交换

    2.单指针收集,一种很重要的思想

    class Solution(object): def sortColors(self, nums): n=len(nums) p0,p2=0,n-1 i=0 while i<=p2: while i<=p2 and nums[i]==2: nums[i],nums[p2]=nums[p2],nums[i] p2-=1 if nums[i]==0: nums[i],nums[p0]=nums[p0],nums[i] p0+=1 i+=1 class Solution: def sortColors(self, nums: List[int]) -> None: n=len(nums) p=0 for i in range(len(nums)): if nums[i]==0: nums[i],nums[p]=nums[p],nums[i] p+=1 for i in range(p,len(nums)): if nums[i]==1: nums[i],nums[p]=nums[p],nums[i] p+=1

    编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。

    示例:

    输入: head = 3->5->8->5->10->2->1, x = 5 输出: 3->1->2->10->5->5->8

    1.和颜色排序一个思路,用一个或多个指针指向想要做的事,另一个指针遍历链表!

    # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def partition(self, head: ListNode, x: int) -> ListNode: p=q=head while q: if q.val<x: q.val,p.val=p.val,q.val p=p.next q=q.next return head

     

    Processed: 0.010, SQL: 9