long blogs

进一步有进一步惊喜


  • Home
  • Archive
  • Tags
  •  

© 2025 long

Theme Typography by Makito

Proudly published with Hexo

辗转相除法

Posted at 2019-03-11 算法 

辗转相除法求最大公因子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
   int hfc(int m,int n)
{
int r=1;
r = m % n;
while(r!=0){
if(r==1){
return 1;
}
m=n;
n=r;
r=m % n;
}
return n;
}
优化版的辗转相除法
1
2
3
4
5
6
7
8
9
10
11
12
public int hfc(int m,int n)
{
int r =1;
r = m % n;
while ( r != 0)
{
m = n;
n = r;
r = m % n;
}
return n;
}

合并两个数组

题目描述:
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

说明:

初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:

1
2
3
4
输入:
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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

算法思路

由于两个数组都是有序的,则可以使用类似于归并排序的思想。从后往前合并数组,每次选择从两个数组中选取其中最大的合并到nums1的尾部。
边界处理:
1、nums1值为空,将nums2复制到nums1中。
2、nums2为空,不做任何处理

我的题解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public void merge(int[] nums1, int m, int[] nums2, int n) {
int point = m + n -1;
-- m;
-- n;
// 归并排序的思想
while(m >=0 && n >= 0){
if(nums1[m] > nums2[n]){
nums1[point] = nums1[m];
-- point;
-- m;
}else{
nums1[point] = nums2[n];
-- point;
-- n;
}
}
while( n >= 0 ){
nums1[point] = nums2[n];
-- point;
-- n;
}
}
大神的题解
1
2
3
4
5
6
7
8
9
10
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p = m-- + n-- - 1;
while (m >= 0 && n >= 0) {
nums1[p--] = nums1[m] > nums2[n] ? nums1[m--] : nums2[n--];
}

while (n >= 0) {
nums1[p--] = nums2[n--];
}
}

Share 

 Previous post: hexo 基本用法

© 2025 long

Theme Typography by Makito

Proudly published with Hexo