首页 > 编程语言 > 详细

leetcode: 数组

时间:2016-04-06 14:43:39      阅读:181      评论:0      收藏:0      [点我收藏+]

1. longest-consecutive-sequence

Given an unsorted array of integers, find the length of the longest consecutive elements sequence.

For example,
Given[100, 4, 200, 1, 3, 2],
The longest consecutive elements sequence is[1, 2, 3, 4]. Return its length:4.

Your algorithm should run in O(n) complexity.

 

给定一个整形数组,求出最长的连续序列。例如数组[100,4,200,1,3,2],最长的连续序列长度为[1,2,3,4],长度为4。要求时间复杂度为O(n)。

 

排序的话至少要O(nlgn) 的复杂度。O(n)的复杂度,目前只找到了使用hash来解决的方案,add, remove, contains 等方法的复杂度都是 O(1),因此两次遍历的操作复杂度为 O(n)。

技术分享
public static int longestConsecutive(int[] num) {
    // if array is empty, return 0
    if (num.length == 0) {
        return 0;
    }
 
    Set<Integer> set = new HashSet<Integer>();
    int max = 1;
 
    for (int e : num)
        set.add(e);
 
    for (int e : num) {
        int left = e - 1;
        int right = e + 1;
        int count = 1;
 
        while (set.contains(left)) {
            count++;
            set.remove(left);
            left--;
        }
 
        while (set.contains(right)) {
            count++;
            set.remove(right);
            right++;
        }
 
        max = Math.max(count, max);
    }
 
    return max;
}
View Code

 

 

2. surrounded-regions

Given a 2D board containing‘X‘and‘O‘, capture all regions surrounded by‘X‘.

A region is captured by flipping all‘O‘s into‘X‘s in that surrounded region .

For example,

X X X X
X O O X
X X O X
X O X X

After running your function, the board should be:

X X X X
X X X X
X X X X
X O X X

典型的BFS题目。遍历每个字符,如果是“O”,则从当前字符开始BFS遍历,如果周围也是“O”则加入当前遍历的队列,知道遍历完所有相邻的“O”,于此同时,判断每个O是否是被包围的,只有由一个O是没有被包围的,则当前遍历的O的集合都是没有被包围的,因为这些O都是相连的。

当然,此题使用DFS也可以,只是测试数据过大,提交时StackOverFlow.

 

1)BFS 广度优先搜索

技术分享
public class Solution {
    // use a queue to do BFS
    private Queue<Integer> queue = new LinkedList<Integer>();
 
    public void solve(char[][] board) {
        if (board == null || board.length == 0)
            return;
 
        int m = board.length;
        int n = board[0].length;
 
        // merge O‘s on left & right boarder
        for (int i = 0; i < m; i++) {
            if (board[i][0] == ‘O‘) {
                bfs(board, i, 0);
            }
 
            if (board[i][n - 1] == ‘O‘) {
                bfs(board, i, n - 1);
            }
        }
 
        // merge O‘s on top & bottom boarder
        for (int j = 0; j < n; j++) {
            if (board[0][j] == ‘O‘) {
                bfs(board, 0, j);
            }
 
            if (board[m - 1][j] == ‘O‘) {
                bfs(board, m - 1, j);
            }
        }
 
        // process the board
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (board[i][j] == ‘O‘) {
                    board[i][j] = ‘X‘;
                } else if (board[i][j] == ‘#‘) {
                    board[i][j] = ‘O‘;
                }
            }
        }
    }
 
    private void bfs(char[][] board, int i, int j) {
        int n = board[0].length;
 
        // fill current first and then its neighbors
        fillCell(board, i, j);
 
        while (!queue.isEmpty()) {
            int cur = queue.poll();
            int x = cur / n;
            int y = cur % n;
 
            fillCell(board, x - 1, y);
            fillCell(board, x + 1, y);
            fillCell(board, x, y - 1);
            fillCell(board, x, y + 1);
        }
    }
 
    private void fillCell(char[][] board, int i, int j) {
        int m = board.length;
        int n = board[0].length;
        if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != ‘O‘)
            return;
 
        // add current cell is queue & then process its neighbors in bfs
        queue.offer(i * n + j);
        board[i][j] = ‘#‘;    // 用#标识要保留的O
    }
}
View Code

 

2)DFS深度优先搜索

技术分享
public void solve(char[][] board) {
    if(board == null || board.length==0) 
        return;
 
    int m = board.length;
    int n = board[0].length;
 
    //merge O‘s on left & right boarder
    for(int i=0;i<m;i++){
        if(board[i][0] == ‘O‘){
            merge(board, i, 0);
        }
 
        if(board[i][n-1] == ‘O‘){
            merge(board, i,n-1);
        }
    }
 
    //merge O‘s on top & bottom boarder
    for(int j=0; j<n; j++){
         if(board[0][j] == ‘O‘){
            merge(board, 0,j);
        }
 
        if(board[m-1][j] == ‘O‘){
            merge(board, m-1,j);
        }
    }
 
    //process the board
    for(int i=0;i<m;i++){
        for(int j=0; j<n; j++){
            if(board[i][j] == ‘O‘){
                board[i][j] = ‘X‘;
            }else if(board[i][j] == ‘#‘){
                board[i][j] = ‘O‘;
            }
        }
    }
}
 
public void merge(char[][] board, int i, int j){
    if(i<0 || i>=board.length || j<0 || j>=board[0].length) 
        return;
 
    if(board[i][j] != ‘O‘)
        return;
 
    board[i][j] = ‘#‘;
 
   // 递归实现深度优先搜索
    merge(board, i-1, j);
    merge(board, i+1, j);
    merge(board, i, j-1);
    merge(board, i, j+1);
}
View Code

 

leetcode: 数组

原文:http://www.cnblogs.com/zxqstrong/p/5358966.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!