演算法題,分享給需要的人
輸入:
輸入一個整形陣列int[] values,表示整個序列的所有值。values 含有2到50個元素(其中包括2和50)
輸出:
返回最長的等差數列的長度
舉例:
values:{3,8,4,5,6,2,2},從這些數字中選取一些數字所組成的最長等差數列是2,3,4,5,6,所以返回5
答案:
public static int longest(int[] values){
if (values==null){
return 0;
}
Arrays.sort(values);
int maxlen=values[values.length-1]-values[0];
int ans=1;
if (maxlen==0){
return values.length;
}
int[][] dp=new int[values.length][maxlen+1];
for (int i = 0; i <dp.length ; i++) {
for (int j = 0; j < maxlen+1; j++) {
dp[i][j]=1;
}
}
for (int i = 1; i <values.length ; i++) {
for (int j = i-1; j >=0; j--) {
int diff=values[i]-values[j];//算出i和j之間的等差
dp[i][diff]=dp[j][diff]+1;//當前
ans=Math.max(ans,dp[i][diff]);
}
}
return ans;
}
2.如果一個正整數不能被大於1的完全平方數所整除,那麼我們就將該數稱為無平方數因子的數。例如,靠前的一些無平方數因數的數是{1,2,3,5,6,7,10,11,13,14,15,17,19…}。 給出一個整數n,返回第n個無平方數因子的數。
輸入:
輸入一個整數n. n 的取值範圍為1到1,000,000(其中包括1和1,000,000)
輸出:
返回第n個無平方數因數的數
舉例:
n = 13, 返回19.
答案:
public static int getNumber(int n) {
long result = -1;
int count = 0;
for (long i = 1; i <= Long.MAX_VALUE; i++) {
boolean found = false;
for (long j = 2; j <= i; j++) {
if (j * j > i) {
break;
}
if (i % j == 0 && i % (j * j) == 0) {
found = true;
break;
}
}
if (!found) {
count++;
if (count == n) {
result = i;
break;
}
}
}
return (int) result;
}
3.大雄把自己置身於一個無限大的二維平面中,然後假設,自己每次只能移動一步且不能向後移動,同時走過的格子立即塌陷,無法再走第二次。大雄想知道,如果走n步,有 多少個可能到達的終點。
輸入:
一個正整數n(0<n<=20),表示要走n步。
輸出:
走n步能到達的終點的數量。
舉例:
輸入1,輸出3。
答案:
public static void numOfPath(int n) {
int[] a = new int[21];
int i;
a[0] = 1;
a[1] = 3;
for (i = 2; i <= 20; i++) {
a[i] = 2 * a[i - 1] + a[i - 2];
}
System.out.println(a[n]);
}