算法刷题训练(2020.10.6)

1.合并两个有序数组

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

说明:

初始化 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]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array

代码实现:

1.采用三指针解法

思路:

​ 1.因为最终排序结果存在nums1中,所以定义一个数组nums用来作为nums1的备份(从而实现比较和赋值功能)

​ 2.当有一方先遍历完毕,则把另一方剩余部分合并至nums1数组后

​ ps:针对arraycopy(nums2,j,nums1,i+j,m+n-i-j)方法解释:将nums2数组中从j及以后的部分复制到nums1数组下标为i+j开始的位置,长度为m+n-i-j

class Solution {
   public void merge(int[] nums1, int m, int[] nums2, int n) {
        // two pointer for nums and nums2
        int i = 0;
        int j = 0;

        // Set pointer for nums1
        int p = 0;
        int[] nums = new int[m];
        System.arraycopy(nums1,0,nums,0,m);
        while ((i<m)&&(j<n)){
            if (nums[i]>=nums2[j]){
                nums1[p++] = nums2[j++];
            }else {
                nums1[p++] = nums[i++];
            }
        }
        if (j<n){
            System.arraycopy(nums2,j,nums1,i+j,m+n-i-j);
        }
        if (i<m){
            System.arraycopy(nums,i,nums1,i+j,m+n-i-j);
        }
    }
}

2.采用暴力破解

思路:

​ 由题意不难想象到它可以先合并再排序,有现成的调用方法arraycopy() 和 sort()

class Solution {
   public static void merge(int[] nums1, int m, int[] nums2, int n) {
        System.arraycopy(nums2,0,nums1,m,n);
        Arrays.sort(nums1);
    }
}

2.杨辉三角(一)

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。

在杨辉三角中,每个数是它左上方和右上方的数的和。

示例:

输入: 5
输出:
[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pascals-triangle

思路:

​ 1.初始化第0行,[ [1] ]

   2. 从第一行开始循环:每一行的第一列都为1,最后一个也为1
   3. 中间数据为 :上一行值+上一行值的左边值

代码实现:

class Solution {
     public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> triangle = new ArrayList<>();
        // first base case: if user requests zero rows,they get zero rows;
        if (numRows == 0){
            return triangle;
        }

        // Second base case:first row is always [1]
        triangle.add(new ArrayList<>());
        triangle.get(0).add(1);
        // 从第一行开始(0行已经赋值)
        for (int i=1;i<numRows;i++){
            // 定义当前行:为list集合,需初始化
            List<Integer> row = new ArrayList();
            // 定义前一行: 取值
            List<Integer> pre = triangle.get(i-1);
            // 每一行的第一个值为1
            row.add(1);
            // 每一行后面的值为: 上一行值+上一行值的左边值
            for (int j=1;j<i;j++){
                row.add(pre.get(j) + pre.get(j-1));
            }
            // 每一行最后一个值为1
            row.add(1);
            // 将每一行添加到triangle中
            triangle.add(row);
        }
        return triangle;
}
posted @ 2020-10-06 16:04  ~快乐王子~  阅读(216)  评论(0编辑  收藏  举报