约瑟夫环

来源:互联网 发布:weibull++软件下载 编辑:程序博客网 时间:2024/06/12 00:51

具体问题我就不描述了,就是著名的约瑟夫问题。

解决方法:

1,普通解法,时间复杂度O(n*m):

使用循环链表,返回唯一剩下的节点。

private Node josephusKill(Node head,int m){ //head是一个循环链表,m表示从1数到第m个数,第m个数被去除    if(head == null || head.next == head ||m<1){        return head;    }    Node last = head;    while(last.next != head){        last = last.next;    }    int count = 0;    while(head != last){        if(++count == m){            last.next = head.next;            count = 0;        }else {            last = last.next;        }        head = last.next;    }    return head;}
2,可以直接算出活下来的人的最初位置

private int getLive(int n,int m){    if(n == 1){        return 1;    }    return (getLive(n-1,m)+m-1)%n+1;}




原创粉丝点击