1、对于给定的非负整数r和n(r≤n),请编写程序计算组合数C(r,n) = n! / r! / (n-r)!。
(本题目用于测试的所有用例,都保证结果小于2^31-1)
import java.util.*;
public class Solution {
public static int combination (int r, int n) {
long p = 1;
for(int i=n;i>n-r;i--){
p *= n;
}
for(int i=1;i<=r;i++){
p /= i;
}
return (int)p;
}
}
以上是我的方法,但是超时了。学习一下其他解法。
import java.util.*;
public class Solution {
public int combination (int r, int n) {
if(r==0){
return 1;
}
if(r==1)
return n;
if(r>n/2){
return combination(n-r,n);
}
if(r>1){
return combination(r-1,n-1)+combination(r,n-1);
}
return -1;
}
}
组 合 数 公 式 : C n m = C n − 1 m + C n − 1 m − 1 {组合数公式:} C^m_n=C^m_{n-1}+C^{m-1}_{n-1} 组合数公式:Cnm=Cn−1m+Cn−1m−1
2、现给出两个有序整型数组,其中array1按升序(从小到大)排序,array2按降序排序,请你将 array1和array2 合并到一个新的数组中,并保持新中的元素按升序排序。
说明:给出 array1 和 array2 及其元素数量n 和 m ,返回合并后的新数组。
import java.util.*;
public class Solution {
private static void QuickSort(int[] num, int left, int right) {
if(left>=right) {
return;
}
int key=num[left];
int i=left;
int j=right;
while(i<j){
while(num[j]>=key && i<j){
j--;
}
while(num[i]<=key && i<j){
i++;
}
if(i<j){
int temp=num[i];
num[i]=num[j];
num[j]=temp;
}
}
num[left]=num[i];
num[i]=key;
QuickSort(num,left,i-1);
QuickSort(num,i+1,right);
}
public static int[] arrayMerge (int[] array1, int n, int[] array2, int m) {
int[] array = new int[m+n];
for(int i=0;i<n;i++){
array[i]=array1[i];
}
for(int i=0;i<m;i++){
array[i+n]=array2[i];
}
QuickSort(array,0,n+m-1);
return array;
}
}
第二题继续超时,看了下没有通过的代码示例,但是也可以学习一下其他方法。
public int[] arrayMerge (int[] array1, int n, int[] array2, int m) {
int[] res=new int[n+m];
int i=0,j=m-1,k=0; //双指针
while(i<n&&j>=0){
if(array1[i]<array2[j]) res[k++]=array1[i++];
else if(array1[i]>array2[j]) res[k++]=array2[j--];
else {
res[k++]=array1[i++];res[k++]=array2[j--]; }
}
while (i<n) res[k++]=array1[i++];
while (j>=0) res[k++]=array2[j--];
return res;
}