• 三色旗问题


    题目:只有0,1,2组成的数组,将其按0..0..1...1..2...2排序。(leetcode75)

    分析:

    非常有意思的一道题目。由 Dijkstra 提出

    快速排序其实就是不断地调用partition分区函数,快速排序只需要分2个区,用了两个指针。

    这里3个分区就需要三个指针。

    主要看中间指针p2,

    若p2=0,交换p1,p2,两者加加;

    若p2=1,p2++;

    若p2=2,交换p2,p3,p3--.

        void sortColors(vector<int>& nums) {
            int p1 = 0, p2 = 0, p3 = nums.size()-1;
            while(p2 <= p3)  // 3 1 2
            {
                if(nums[p2] == 0)
                {
                    swap(nums[p1], nums[p2]);
                    p1++;
                    p2++;
                }
                else if(nums[p2] == 1)
                {
                    p2++;
                }
                else
                {
                    while(p3 > p2 && nums[p3] == 2)  p3--; //可写可不写
                    swap(nums[p2], nums[p3]);
                    p3--;
                }
            }
            for(int x : nums)  printf("%d ", x);
        }

    题目:有序数组去重(leetcode26)

    用一个指针互异元素的最后一个,另外一个指针遍历

        int removeDuplicates(vector<int>& nums) {
            int k = 0;
            for(int i = 1;i < nums.size();i++)
            {
                if(nums[i] != nums[k])
                {
                    k++;
                    swap(nums[k], nums[i]);
                }
            }
            return k+1;
        }

    题目:移除数组中所有与给定值相同的数。(leetcode27)

    思路:与26题方法完全一致。

        int removeElement(vector<int>& nums, int val) {
            int k = 0;
            for(int i = 0;i < nums.size();i++)
            {
                if(nums[i] != val)  nums[k++] = nums[i];
            }
            return k;
        }

    题目:将数组中所有零元素移到最后。(leetcode283)

    思路:一个指针指向最后一个非零元素,一个指针遍历,注意赋值完后置为0.

        void moveZeroes(vector<int>& nums) {
            int k = 0;
            for(int i = 0;i < nums.size();i++)
            {
                if(nums[i])
                {
                    nums[k++] = nums[i];
                    if(i >= k) nums[i] = 0;
                }
            }
        }

    题目:移除有序链表中重复的元素(leetcode83)

    思路:跳过即可

    //非递归

        ListNode* deleteDuplicates(ListNode* head) {
            if(head == NULL)  return head;
            ListNode* p = head;
            while(p->next != NULL)
            {
                if(p->val == p->next->val) p->next = p->next->next;
                else p = p->next;
            }
            return head;
        }

    //递归

        ListNode* deleteDuplicates(ListNode* head) {
            if(head == NULL || head->next == NULL)  return head;
            ListNode* p = deleteDuplicates(head->next);
            if(p->val != head->val)
            {
                head->next = p;
                return head;
            }
            else
            {
                return p;
            }

    题目:删除有序数组中重复出现的元素(leetcode82)

    //非递归

    // 递归

        ListNode* deleteDuplicates(ListNode* head) {
            if(head == NULL || head->next == NULL)  return head;
            ListNode* p = head;
            bool flag = false;
            while((p != NULL) && (p->next != NULL) && (p->val == p->next->val))
            {
                flag = true;
                p = p->next;
            }
            if(flag) return deleteDuplicates(p->next);
            else
            {
                p->next = deleteDuplicates(p->next);
                return p;
            }
        }

     参考链接:https://blog.csdn.net/liyinan11/article/details/71036227

  • 相关阅读:
    [MFC美化] Skin++使用详解-使用方法及注意事项
    [MFC美化] SkinMagic使用详解3- 常见使用问题解答
    [MFC美化] SkinMagic使用详解2- SkinMagic常用函数介绍
    [MFC美化] SkinMagic使用详解1- SkinMagic使用流程
    MFC 自定义控件
    error C3872: “0x3000”: 此字符不允许在标识符中使用
    websocket学习
    Servlet学习1
    Git使用学习
    异常捕获测试
  • 原文地址:https://www.cnblogs.com/lfri/p/12468616.html
Copyright © 2020-2023  润新知