程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> LeetCode -- SpiralOrder

LeetCode -- SpiralOrder

編輯:C++入門知識

LeetCode -- SpiralOrder


題目描述:


Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.


For example,
Given the following matrix:


[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].


從例子可以看出,需要做的是從矩陣的第一個元素為起始,沿外環向內依次遍歷,最後打印出結果。


思路:
獲取矩陣的長寬,設需要走n圈,則n = Min(寬度,高度)/2。
從左上節點為起始開始遍歷,走到最右的最後一個元素開始向下走,走到最後向左走,最後向上走。走了一圈,需要把坐標往內+1。
需要考慮剛好處於矩陣中間線的情況。


實現代碼:






public class Solution {
    public IList SpiralOrder(int[,] matrix) {
   if(matrix == null){
		return new List();		
	}
	
	var result = new List();
	
	var rowLen = matrix.GetLength(0);
	var len = matrix.GetLength(1);
	
	if(rowLen == 1){
		for(var i =0 ;i < len; i++){
			result.Add(matrix[0,i]);
		}
		return result;
	}
	if(len == 1){
		for(var i =0 ;i < rowLen; i++){
			result.Add(matrix[i,0]);
		}
		return result;
	}
	
	var minLen = Math.Min(rowLen,len);
	var cycleCount = minLen % 2 == 0 ? minLen/2 : (minLen + 1) / 2;
	var c = 0;
	
	for(var i = 0;i < cycleCount; i++){
		if(c == len-c-1){
			for(var k = c;k < rowLen - c; k++){
				result.Add(matrix[k, c]);	
			}
			
			c++;
			continue;
		}
		
		// stick row to top, column : [c,len-c-1]
		for(var top = c; top < len-c - 1; top++){
			result.Add(matrix[c,top]);
		}
		
		// stick column to right, row : [c,rowLen-c-1]
		for(var right = c; right < rowLen-c - 1; right ++){
			result.Add(matrix[right, len-c-1]);
		}
		
		// stick row to bottom, column : [len-c-1, c]
		for(var down = len-c -1; down > c; down --){
			result.Add(matrix[rowLen-c-1, down]);
		}
		
		// stick column to left, row : [len-c-1, c]
		for(var left = rowLen-c - 1; left > c; left --){
			result.Add(matrix[left, c]);
		}
		
		c++;
	}
	
	return result;
    }
    


 
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved