616 - 安排课程

2017.9.11

超时超时超时,去死吧

public class Solution {
    /**
     * @param numCourses a total of n courses
     * @param prerequisites a list of prerequisite pairs
     * @return the course order
     */
    public int[] findOrder(int numCourses, int[][] prerequisites) {
 		// 首先是要构建图。
		ArrayList<HashSet<Integer>> list = new ArrayList<HashSet<Integer>>();
		// 先建立头结点。
		for(int i = 0; i < numCourses; i++){
			list.add(new HashSet<Integer>());
		}
		//建立所有的后序链表。     // inDegree计算所有的节点的入度。
		int []inDegree = new int[numCourses];
		for(int []x : prerequisites){
			if(!list.get(x[1]).contains(x[0])){
				list.get(x[1]).add(x[0]);
				inDegree[x[0]] ++;
			}
		}
	    //找到一个入度为0的节点,开始遍历。
		int []res = new int[numCourses];
		for(int j = 0; j < numCourses; j++){
			int i = 0;
			for(i = 0; i < numCourses;i++){
				//在这里找到了一个入度为0的点。
				if(inDegree[i] == 0){
					res[j] = i;
					break;
				}
			}
			if(i == numCourses){
				res = new int[0];
				return res;
			}
			inDegree[i] = -1;
			Iterator ite = list.get(i).iterator();
			while(ite.hasNext()){
				inDegree[(int)ite.next()]--;
			}
		}
		return res;
		
	}
}



后来采用了队列的方法,不超时了。呵呵呵呵呵。

public class Solution {
    /**
     * @param numCourses a total of n courses
     * @param prerequisites a list of prerequisite pairs
     * @return the course order
     */
   	 public int[] findOrder(int numCourses, int[][] prerequisites) {
	 		// 首先是要构建图。
			ArrayList<HashSet<Integer>> list = new ArrayList<HashSet<Integer>>();
			// 先建立头结点。
			for(int i = 0; i < numCourses; i++){
				list.add(new HashSet<Integer>());
			}
			//建立所有的后序链表。     // inDegree计算所有的节点的入度。
			int []inDegree = new int[numCourses];
			for(int []x : prerequisites){
				if(!list.get(x[1]).contains(x[0])){
					list.get(x[1]).add(x[0]);
					inDegree[x[0]] ++;
				}
			}
		    //找到一个入度为0的节点,开始遍历。
			int []res = new int[numCourses];
			int count = 0;
			LinkedList<Integer> queue = new LinkedList<Integer>();
			for(int i = 0; i < numCourses; i++){
				if(inDegree[i] == 0){
					inDegree[i] = -1;
					queue.addLast(i);
				}
			}
			while(!queue.isEmpty()){
				res[count++] = queue.peekFirst();
				Iterator ite = list.get(queue.pollFirst()).iterator();
				while(ite.hasNext()){
					int tmp = (int)ite.next();
					inDegree[tmp] = inDegree[tmp] - 1;
					if(inDegree[tmp] == 0){
						inDegree[tmp] = -1;
						queue.addLast(tmp);
					}
				}
			}
			if(count == numCourses){
				return res;
			}
			else{
				return res = new int[0];
			}	
		}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值