剑指offer--45.约瑟夫环问题

题目:0,1,,,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字,求出这个圆圈里剩下的最后一个数字。eg,0,1,2,3,4这五个数字,从数字0开始每次删除第3个数字,则删除依次为2,0,4,1,最后剩下的数字是3

分析:可用环形链表来模拟圆圈,剑指offer上有讲解利用递归公式,还没看懂,持续更新。。。

import java.util.*;
public class wr45YueSeFu {
	public static int LastRemaining_Solution(int n, int m){
		if(n<1 || m<1){
			return 0;
		}
		ArrayList<Integer> list=new ArrayList<>();
		for(int i=0;i<n;i++){
			list.add(i);
		}
		int index=(m-1)%list.size();
		while(list.size()!=1){
			list.remove(index);
			index=(index+m-1)%list.size();
		}
		return list.get(0);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(LastRemaining_Solution(5,3));
	}

}

看到有人用数组来模拟,

//	数组,每次当前元素的移动都伴随着计步器加1,当步数等于m时,当前元素设为-1,表示已经被删除
	public static int byArray(int n,int m){
		if(n<1 || m<1){
			return -1;
		}
		int []a=new int[n];
		int curIndex=-1;//当前遇到对象索引
		int count=0;
		int num=n;
		while(num>0){
			curIndex++;//移动到上次被删除元素的下一个元素
//			如果目前是最后一个了,则从头开始,模拟环
			if(curIndex==n){
				curIndex=0;
			}
//			如果目前已经被删除,跳过,不计数
			if(a[curIndex]==-1){
				continue;
			}
			count++;
			if(count==m){
				a[curIndex]=-1;
				count=0;
				num--;
			}
		}
		return curIndex;
	}

猜你喜欢

转载自blog.csdn.net/autumn03/article/details/80366202
今日推荐