1.丑数
public class Solution{
public int GetUglyNumber_Solution(int index){
if(index<=0) return 0;
int p2=0,p3=0,p5=0;
int[] result=new int[index];
result[0]=1;
for(int i=1;i<index;i++){
result[i]=Math.min(result[p2]*2,Math.min(result[p3]*3,result[p5]*5));
if(result[i]==result[p2]*2)p2++;
if(result[i]==result[p3]*3)p3++;
if(result[i]==result[p5]*5)p5++;
}
return result[index-1];
}
}
思路:1.先指定三个最小的丑数([p2]*2,[p3]*3,[p5]*5);
2.定义一个数组结果集 int[] result=new int[index];
3.遍历数组,result=Math.min([p2]*2,[p3]*3,[p5]*5)为最后的丑数结果集。
4.分别求出其他丑数:
result[i]==result[p2]*2;result[i]==result[p3]*3;result[i]==result[p5]*5;
丑数=2^x3^y5^z;(只需要把得到的丑数不断乘以2、3、5后按顺序放入)
有序的放入为难点:1.要维持三个指针来记录当前乘以2、乘以3、乘以5的最小值,然后当其选为最小值后,把相应的指针+1;
数组中的每一个值都会被乘以2、乘以3、乘以5,只不过不是同时乘以2、3、5,而是在需要的时候乘。
2.孩子们的游戏(圆圈中最后剩下的数)
import java.util.*;
public class Solution{
public int LastRemaining_Solution(int n,int n){
if(n<1||m<1){
return -1;
}
List<Integer> list=new ArrayList<>();
for(int i=0;i<n;i++){
list.add(i);
}
int cur=-1;
while(list.size()>1){
for(int i=0;i<m;i++){
cur++;
if(cur==list.size()){
cur=0;
}
}
list.remove(cur);
cur--;
}
return list.get(0);
}
}
思路:
1.先用list模拟环形链表List<Integer> list=new ArrayList<>();
2.然后将人数n添加到链表里;
3.然后遍历指定的数,指针移动到指定的数。
如果指针遍历完整个链表,cur=0.
3.求1+2+3+…+n
public class Solution{
public int Sum_Solution(int n){
int sum=n;
boolean result=(n>0)&&((sum+=Sum_Solution(n-1))>0);
return sum;
}
}
因为求和公式:sum=[(1+n)*n]/2;