zoukankan      html  css  js  c++  java
  • 算法刷题训练(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;
    }
    
  • 相关阅读:
    Servant:基于Web的IIS管理工具
    mono-3.4.0 源码安装时出现的问题 [do-install] Error 2 [install-pcl-targets] Error 1 解决方法
    使用 OWIN Self-Host ASP.NET Web API 2
    Xamarin和微软发起.NET基金会
    SQLite vs MySQL vs PostgreSQL:关系型数据库比较
    Mono 3.2.7发布,JIT和GC进一步改进
    如何使用Microsoft技术栈
    c#开源消息队列中间件EQueue 教程
    通过一组RESTful API暴露CQRS系统功能
    NEsper Nuget包
  • 原文地址:https://www.cnblogs.com/happy-prince/p/13773654.html
Copyright © 2011-2022 走看看