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;
}