leetcode 刷题日记 - 数组篇(2) -- 基本算法变形

递归排序思想

leetcode 88 题:合并两个有序数组

题目:

* 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
*
* 说明:
*
*
*  初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
*  你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
*
*
* 示例:
*
* 输入:
* nums1 = [1,2,3,0,0,0], m = 3
* nums2 = [2,5,6],       n = 3
*
* 输出: [1,2,2,3,5,6]


class Solution {
/*    思想:
        假设一个数组nums1[]足够大可以容纳m+n个数且只有前下标前m个有元素 p指向该数组最后位置 
        p1指向最后 nums1 下标为 m-1 的位置
        p2指向最后 nums2 下标为 n-1 的位置
        每次比较 下标 p1 与 p2 的大小:
            nums[p1]>nums[p2] nums[p]=nums[p1] p-- p1--
            nums[p2]>nums[p1] nums[p]=nums[p2] p-- p2--
            由于足够大 大于等于 m + n
            则当 p1 元素全部比较完只剩下 位置 p2的元素 则将 p2以前为未比较的元素全部复制 p 以前*/
    public void merge(int[] nums1, int m, int[] nums2, int n) {
 
        int p1=m-1;//nums1[0...p1]元素待比较
        int p2=n-1;//nums1[0...p2]有元素待比较
        int p=m+n-1;//nums1[p...m+n-1]元素已经比较好
        while(p1>=0&&p2>=0){//还有元素比较
            nums1[p--]=(nums1[p1]>=nums2[p2])?nums1[p1--]:nums2[p2--];
        }
        if(p2>=0){
            System.arraycopy(nums2,0,nums1,0,p2+1);
            /*源码:public static native void arraycopy(Object src,  int  srcPos,
                Object dest, int destPos,int length);
              参数:
              src:要复制的数组(源数组)
              srcPos:复制源数组的起始位置
              dest:目标数组
              destPos:目标数组的下标位置
              length:要复制的长度
           */
        }
    }
}

对应题目链接:https://leetcode-cn.com/problems/merge-sorted-array/


快速排序思想:

leetcode 75 颜色分类

题目:

* 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
*
* 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
*
* 注意:
* 不能使用代码库中的排序函数来解决这道题。
*
* 示例:
*
* 输入: [2,0,2,1,1,0]

* 输出: [0,0,1,1,2,2]
public class Solution4 {
    public void sortColors(int[] nums) {
        /*三路快排思想
        * [0...one]为等于0的元素
        * [one+1...i]为等于1的元素
        * [two...length-1]为等于2的元素
        *
        * 遍历下标为i的数组 如果为1 i++
        * 如果为0 one++ swap(nums[one],nums[i]) i++ nums[i]=0
        * 如果为2 two-- swap(nums[two],nums[i]) nums[i]未比较
        * */
        int one=-1;
        int two=nums.length;
        for(int i=0;i<two;){
            if (nums[i]==1)
                i++;
            else if(nums[i]==0){
                one++;
                int temp =nums[one];
                nums[one]=nums[i];
                nums[i]=temp;
                i++;
            }else{//nums[i]=2
                //assert (nums[i]!=2);//断言如果不是0,1,2
                two--;
                int temp =nums[two];
                nums[two]=nums[i];
                nums[i]=temp;
            }
        }
    }
}

对应题目链接:https://leetcode-cn.com/problems/sort-colors/

 

 

 

--- 来源 leetcode --

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值