leetcode778. 水位上升的泳池中游泳 兩種方法

leetcode778. 水位上升的泳池中游泳

題目

leetcode778. 水位上升的泳池中游泳

解題的方法

dfs + 二分發

在這裏二分的意思是在取值的範圍類,進行二分的查找,看是否能夠到達 右下角的元素。如果能夠到達就ri(右邊的邊界) = mid縮小mid的值,如果不能夠,就擴大mid的範圍,就是le(左邊的邊界) = mid。當le == ri時 就是最小的值。

class Solution {
	class Road{
		int[][] board;
		int X_len, Y_len;
        int[] X = {1,-1,0,0};
		int[] Y = {0,0,-1,1};
		int res = 1000;
		public Road(int l1, int l2) {
			board = new int[l1][l2];
            board[0][0] = 1;
			X_len = l1;
			Y_len = l2;
		}
		public boolean dfs(int x, int y, int[][] grid, int mid) {
			int i = 0;
			int a,b;
			if(x == X_len - 1 && y == Y_len - 1) {
				return true;
			}
			for(i = 0; i < 4; i++){
				a = x + X[i];
				b = y + Y[i];
				if(a >= 0 && a < X_len && b < Y_len && b >= 0 && board[a][b] == 0 && grid[a][b] <= mid){
					board[a][b] = 1;
                    if(dfs(a, b, grid, mid)){
                        return true;
                    }
				}
			}
            return false;
		}
        public void clear(int l1, int l2){
            board = new int[l1][l2];
        }
	}
    public int swimInWater(int[][] grid) {
        int le = Math.max(grid[0][0],grid[grid.length - 1][grid[0].length - 1]), ri = 50 * 50 - 1;
        Road road = new Road(grid.length, grid[0].length);
        while(le < ri){
            int mid = (le + ri)>>1;
            //System.out.println("le = "+le+" mid = "+mid+" ri = "+ri);
            if(road.dfs(0, 0, grid, mid)) {
                ri = mid;
            }
            else{
                le = mid + 1;
            }
            road.clear(grid.length, grid[0].length);
        }
        return ri;
    }
}

地雷

原博客
最小的值(val)開始進行遞增,如果值小於或等於val則把數組賦值爲val,然後繼續遍歷下去就只要右下角的值等於val就說明這個值是最小適合的值(因爲val是從最小的值進行遞增的)

class Solution {
    int[] X = {0,0,-1,1};
    int[] Y = {1,-1,0,0};
    public void dfs(int m,int n, int m_len, int n_len, int val, int[][] grid){
        if(grid[m][n] >= val){
            return ;
        }
        grid[m][n] = val;
        for(int i = 0; i < 4; i++){
            int a = m + X[i];
            int b = n + Y[i];
            if(a >= 0 && a < m_len && b >= 0 && b < n_len){
                dfs(a,b,m_len,n_len,val, grid);
            }
        }
    }
    public int swimInWater(int[][] grid) {
        int i;
        int m_len = grid.length, n_len = grid[0].length;
        int val = Math.max(grid[0][0], grid[m_len - 1][n_len - 1]);
        while(true){
            dfs(0, 0, m_len, n_len, val + 1, grid);
            if(grid[m_len - 1][n_len - 1] == val + 1){
                return val;
            }
            val++;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章