zoukankan      html  css  js  c++  java
  • 数据结构强化1

    Union Find    集合合并,查找元素在集合里面

    数组实现

        int[] pre;
        public int find(int x) {
            int r = x;
            while (r != pre[r]) {
                r = pre[r];
            }
            int i = x, j;
            while (pre[i] != r) {
                j = pre[i];
                pre[i] = r;
                i = j;
            }
            return r;
        }
        public void union(int x, int y) {
            int fx = find(x);
            int fy = find(y);
            if (fx != fy) {
                pre[fx] = fy;
            }
        }
    View Code

    hashMap实现

    class UnionFind <T>{
        private Map<T, T> map = new HashMap<>();
        
        public UnionFind(Set<T> set) {
            for (T t : set) {
                map.put(t, t);
            }
        }
        
        public T find(T x) {
            T r = x;
            if (r != map.get(r)) {
                r = map.get(r);
            }
            
            T i = x, j;
            while (i != r) {
                j = map.get(i);
                map.put(i, r);
                i = j;
            }
            return r;
        }
        
        public void union(T x, T y) {
            T fx = find(x);
            T fy = find(y);
            if (fx != fy) {
                map.put(fx, fy);
            }
        }
    }
    View Code

     1,找无向图的联通块。 bfs

    找出无向图中所有的连通块。
    
    图中的每个节点包含一个label属性和一个邻接点的列表。(一个无向图的连通块是一个子图,其中任意两个顶点通过路径相连,且不与整个图中的其它顶点相连。)
    
    您在真实的面试中是否遇到过这个题? Yes
    样例
    给定图:
    
    A------B  C
          |  | 
          |  |
          |  |
          |  |
          D   E
    返回 {A,B,D}, {C,E}。其中有 2 个连通块,即{A,B,D}, {C,E}
    
    标签 
    相关题目 
    View Code
         class UndirectedGraphNode {
             int label;
             ArrayList<UndirectedGraphNode> neighbors;
             UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
         }
         public List<List<Integer>> connectedSet(ArrayList<UndirectedGraphNode> nodes) {
            
             List<List<Integer>> result = new ArrayList<>();
             if (nodes == null || nodes.size() == 0) {
                 return result;
             }
             
             Map<UndirectedGraphNode, Boolean> map = new HashMap<>();
             for (UndirectedGraphNode node : nodes) {
                 map.put(node, false);
             }
             
             for (UndirectedGraphNode node : nodes) {
                 if (!map.get(node)) {
                     find(node, result, map);
                 }
             }
             return result;
         }
        private void find(UndirectedGraphNode node, List<List<Integer>> result, Map<UndirectedGraphNode, Boolean> map) {
            ArrayList<Integer> list = new ArrayList<>();
            Queue<UndirectedGraphNode> queue = new LinkedList<>();
            queue.offer(node);
            map.put(node, true);
            while (!queue.isEmpty()) {
                int size = queue.size();
                for (int i = 0; i < size; i++) {
                    UndirectedGraphNode cur = queue.poll();
                    list.add(cur.label);
                    for (UndirectedGraphNode neighbor : cur.neighbors) {
                        if (!map.get(neighbor)) {
                            map.put(neighbor, true);
                            queue.offer(neighbor);
                        }
                    }
                }
            }
            result.add(list);
        }
    View Code

    2 Find the Weak Connected Component in the Directed Graph

     class DirectedGraphNode {
                  int label;
                  ArrayList<DirectedGraphNode> neighbors;
                  DirectedGraphNode(int x) { label = x; neighbors = new ArrayList<DirectedGraphNode>(); }
              }
         public List<List<Integer>> connectedSet2(ArrayList<DirectedGraphNode> nodes) {
             List<List<Integer>> result = new ArrayList<>();
             if (nodes == null || nodes.size() == 0) {
                 return result;
             }
             Set<Integer> set = new HashSet<>();
             for (DirectedGraphNode node : nodes) {
                 set.add(node.label);
             }
             UnionFind uf = new UnionFind(set);
             for (DirectedGraphNode node : nodes) {
                 for (DirectedGraphNode neighbor : node.neighbors) {
                     uf.union(node.label, neighbor.label);
                 }
             }
             Map<Integer, List<Integer>> map = new HashMap<>();
             for (DirectedGraphNode node : nodes) {
                 int parent = uf.find(node.label);
                 if (!map.containsKey(parent)) {
                     map.put(parent, new ArrayList<Integer>());
                 } else {
                     map.get(parent).add(node.label);
                 }
             }
             for (List<Integer> list : map.values()) {
                 result.add(list);
             }
             return result;
         }
    View Code

    3 Number of Islands

    public class Solution {
        /**
         * @param grid a boolean 2D matrix
         * @return an integer
         */
        int m;
        int n;
        int[] dx = {0, 0, 1, -1};
        int[] dy = {-1, 1, 0, 0};
        public int numIslands(boolean[][] grid) {
            if (grid == null || grid.length == 0 || grid[0].length == 0) {
                return 0;
            }
            int islands = 0;
            m = grid.length;
            n = grid[0].length;
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (grid[i][j]) {
                        islands++;
                        bfs(grid, i, j);
                    }
                }
            }
            return islands;
        }
        void bfs(boolean[][] grid, int i, int j) {
            Queue<Integer> queue = new LinkedList<>();
            queue.offer(i * n + j);
            while (!queue.isEmpty()) {
                int size = queue.size();
                for (int k = 0; k < size; k++) {
                    int cur = queue.poll();
                    int x = cur / n;
                    int y = cur % n;
                    grid[x][y] = false;
                    for (int h = 0; h < 4; h++) {
                        int nx = x + dx[h];
                        int ny = y + dy[h];
                        if (isValue(grid, nx, ny)) {
                            queue.offer(nx * n + ny);
                        }
                    }
                }
            }
        }
        boolean isValue(boolean[][] grid, int x, int y) {
            return x >= 0 && x < m && y >= 0 && y < n && grid[x][y];
        }
    }
    bfs
    public class Solution {
        /**
         * @param grid a boolean 2D matrix
         * @return an integer
         */
        int m;
        int n;
        int[] dx = {0, 0, 1, -1};
        int[] dy = {-1, 1, 0, 0};
        public int numIslands(boolean[][] grid) {
            if (grid == null || grid.length == 0 || grid[0].length == 0) {
                return 0;
            }
            int islands = 0;
            m = grid.length;
            n = grid[0].length;
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (grid[i][j]) {
                        islands++;
                        dfs(grid, i, j);
                    }
                }
            }
            return islands;
        }
        void dfs(boolean[][] grid, int i, int j) {
            if (!isValue(grid, i, j)) return;
            grid[i][j] = false;
            for (int k = 0; k < 4; k++) {
                int x = i + dx[k];
                int y = j + dy[k];
                dfs(grid, x, y);
            }
        }
        boolean isValue(boolean[][] grid, int x, int y) {
            return x >= 0 && x < m && y >= 0 && y < n && grid[x][y];
        }
    }
    dfs

    4 3 Number of Islands 2

    描述
     笔记
     数据
     评测
    给定 n,m,分别代表一个2D矩阵的行数和列数,同时,给定一个大小为 k 的二元数组A。起初,2D矩阵的行数和列数均为 0,即该矩阵中只有海洋。二元数组有 k 个运算符,每个运算符有 2 个整数 A[i].x, A[i].y,你可通过改变矩阵网格中的A[i].x],[A[i].y] 来将其由海洋改为岛屿。请在每次运算后,返回矩阵中岛屿的数量。
    
     注意事项
    
    0 代表海,1 代表岛。如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
    
    您在真实的面试中是否遇到过这个题? Yes
    样例
    给定 n = 3, m = 3, 二元数组 A = [(0,0),(0,1),(2,2),(2,1)].
    
    返回 [1,1,2,2].
    View Code
    public class Jdbct {
    
         class Point {
                  int x;
                  int y;
                  Point() { x = 0; y = 0; }
                  Point(int a, int b) { x = a; y = b; }
             }
         public List<Integer> numIslands2(int m, int n, Point[] operators) {
             List<Integer> result = new ArrayList<>();
             if (operators == null || operators.length == 0) {
                 return result;
             }
             int[][] island = new int[m][n];
             Set<Integer> set = new HashSet<>();
             for (int i = 0; i < m; i++) {
                 for (int j = 0; j < n; j++) {
                     set.add(i * n + j);
                 }
             }
             int[] dx = {-1, 1, 0, 0};
             int[] dy = {0, 0, -1, 1};
             UnionFind uf = new UnionFind(set);
             int count = 0;
             for (Point point : operators) {
                 int x = point.x;
                 int y = point.y;
                 if (island[x][y] == 0) {
                     island[x][y] = 1;
                     count++;
                     for (int i = 0; i < 4; i++) {
                         int newX = x + dx[i];
                         int newY = y + dy[i];
                         if (newX >= 0 && newX < m && newY >= 0 && newY < n && island[newX][newY] == 1){
                             int x_father = uf.find(x * n + y);
                             int newX_father = uf.find(newX * n + newY);
                             if (x_father != newX_father) {
                                 count--;
                                 uf.union(x * n + y, newX * n + newY);
                             }
                         }
                     }
                 }
                 result.add(count);
             }
             return result;
         }
    
    }
    class UnionFind {
        private Map<Integer, Integer> map = new HashMap<>();
        
        public UnionFind(Set<Integer> set) {
            for (int t : set) {
                map.put(t, t);
            }
        }
        
        public int find(int x) {
            int r = x;
            if (r != map.get(r)) {
                r = map.get(r);
            }
            
            int i = x, j;
            while (i != r) {
                j = map.get(i);
                map.put(i, r);
                i = j;
            }
            return r;
        }
        
        public void union(int x, int y) {
            int fx = find(x);
            int fy = find(y);
            if (fx != fy) {
                map.put(fx, fy);
            }
        }
    }
    View Code

    5 Surrounded Regions

        public void surroundedRegions(char[][] board)
        {
            // Write your code here
            if (board == null || board.length <= 1 || board[0].length <= 1)
            {
                return;
            }
            for (int i = 0; i < board[0].length; i++)
            {
                fill(board, 0, i);
                fill(board, board.length - 1, i);
            }
            for (int i = 0; i < board.length; i++)
            {
                fill(board, i, 0);
                fill(board, i, board[0].length - 1);
            }
            for (int i = 0; i < board.length; i++)
            {
                for (int j = 0; j < board[0].length; j++)
                {
                    if (board[i][j] == 'O')
                    {
                        board[i][j] = 'X';
                    }
                    else if (board[i][j] == '#')
                    {
                        board[i][j] = 'O';
                    }
                }
            }
        }
        public void fill(char[][] board, int i, int j)
        {
            if (i < 0 || i >= board.length || j < 0 || j >= board[0].length || board[i][j] != 'O') {
                return;
            }
            board[i][j] = '#';
            fill(board, i + 1, j);
            fill(board, i - 1, j);
            fill(board, i, j - 1);
            fill(board, i, j + 1);
        }
    View Code

    6 Graph Valid Tree

        public boolean validTree(int n, int[][] edges) {
            // Write your code here
            if (n == 0) {
                return false;
            }
            if (edges.length != n - 1) {
                return false;
            }
    
            Union u = new Union(n);
            for (int i = 0; i < edges.length; i++){
                if (u.find(edges[i][0]) == u.find(edges[i][1])){
                    return false;
                }
                u.union(edges[i][0], edges[i][1]);
            }
            return true;
        }
    }
    class Union{
        HashMap<Integer, Integer> map = new HashMap<>();
        
        public Union(int n){
            for (int i = 0; i < n; i++){
                map.put(i, i);
            }
        }
        public int find(int x){
            int r = map.get(x);
            
            while (r != map.get(r)){
                r = map.get(r);
            }
            
            int j = x, i;
            while (r != j){
                i = map.get(j);
                map.put(j, r);
                j = i;
            }
            return r;
        }
        
        public void union(int x, int y){
            int fx = find(x), fy = find(y);
            if (fx != fy){
                map.put(x, fy);
            }
        }
    }
    View Code

    Trie   快速找到一个元素,一个字母一个字母查找

    1 Implement Trie

      class TrieNode {  
            public TrieNode[] children = new TrieNode[26];  
            public String item = "";  
              
            // Initialize your data structure here.  
            public TrieNode() {  
            }  
        }  
          
        class Trie {  
            private TrieNode root;  
          
            public Trie() {  
                root = new TrieNode();  
            }  
          
            // Inserts a word into the trie.  
            public void insert(String word) {  
                TrieNode node = root;  
                for (char c : word.toCharArray()) {  
                    if (node.children[c - 'a'] == null) {  
                        node.children[c - 'a'] = new TrieNode();  
                    }  
                    node = node.children[c - 'a'];  
                }  
                node.item = word;  
            }  
          
            // Returns if the word is in the trie.  
            public boolean search(String word) {  
                TrieNode node = root;  
                for (char c : word.toCharArray()) {  
                    if (node.children[c - 'a'] == null) return false;  
                    node = node.children[c - 'a'];  
                }  
                return node.item.equals(word);  
            }  
          
            // Returns if there is any word in the trie  
            // that starts with the given prefix.  
            public boolean startsWith(String prefix) {  
                TrieNode node = root;  
                for (char c : prefix.toCharArray()) {  
                    if (node.children[c - 'a'] == null) return false;  
                    node = node.children[c - 'a'];  
                }  
                return true;  
            }  
        }  
    View Code
    class TrieNode {
        TrieNode[] children = new TrieNode[26];
        boolean hasWord = false;
        public void insert(String word, int index) {
            if (word.length() == index) {
                this.hasWord = true;
                return;
            }
            int pos = word.charAt(index) - 'a';
            if (children[pos] == null) {
                children[pos] = new TrieNode();
            }
            children[pos].insert(word, index + 1);
        }
        public TrieNode find(String word, int index) {
            if (word.length() == index) {
                return this;
            }
            int pos = word.charAt(index) - 'a';
            if (children[pos] == null) {
                return null;
            }
            return children[pos].find(word, index + 1);
        }
    }
    class Trie {
        private TrieNode root;
    
        public Trie() {
            root = new TrieNode();
        }
    
        // Inserts a word into the trie.
        public void insert(String word) {
            root.insert(word, 0);
        }
    
        // Returns if the word is in the trie.
        public boolean search(String word) {
            TrieNode node = root.find(word, 0);
            return (node != null && node.hasWord);
        }
    
        // Returns if there is any word in the trie
        // that starts with the given prefix.
        public boolean startsWith(String prefix) {
            TrieNode node = root.find(prefix, 0);
            return node != null;
        }
    }
    View Code

    2 Word Search

       public boolean exist(char[][] board, String word) 
        {
            // write your code here
            if (word == null || word.length() == 0)
            {
                return true;
            }
            if (board == null || board.length == 0 || board[0].length == 0)
            {
                return false;
            }
            for (int i = 0; i < board.length; i++)
            {
                for (int j = 0; j < board[0].length; j++)
                {
                    if (check(board, word, new boolean[board.length][board[0].length], 0, i, j))
                    {
                        return true;
                    }
                }
            }
            return false;
        }
        private boolean check(char[][] board, String word, boolean[][] bs, int len, int i, int j) {
            // TODO Auto-generated method stub
            if (len == word.length())
            {
                return true;
            }
            if (i < 0 || j < 0 || i >= board.length || j >= board[0].length || bs[i][j]|| board[i][j] != word.charAt(len))
            {
                return false;
            }
            bs[i][j] = true;
            boolean res = check(board, word, bs, len + 1, i + 1, j) ||
                    check(board, word, bs, len + 1, i - 1, j) ||
                    check(board, word, bs, len + 1, i, j + 1) ||
                    check(board, word, bs, len + 1, i, j - 1);
            bs[i][j] = false;
            return res;
        }
    View Code

    3 Word Search II

    public class Solution {
    
        Set<String> res = new HashSet<String>();
        int m = 0, n = 0;
        Trie trie = new Trie();
        public List<String> findWords(char[][] board, String[] words) {
            m = board.length; n = board[0].length;
            for (String s : words){
                trie.insert(s);
            }
            boolean[][] visited = new boolean[m][n];
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++){
                    help(board, visited, "", i, j);
                }
            }
            return new ArrayList<>(res);
        }
        public void help(char[][] board, boolean[][] visited, String item, int i, int j){
            if (i < 0 || i >= m || j < 0 || j >= n || visited[i][j]) return;
            item = item + board[i][j];
            if (!trie.startsWith(item)) return;
            if (trie.search(item)) res.add(item);
            visited[i][j] = true;
            help(board, visited, item, i - 1, j);
            help(board, visited, item, i + 1, j);
            help(board, visited, item, i, j - 1);
            help(board, visited, item, i, j + 1);
            visited[i][j] = false;
        }
    }
        class TrieNode {  
            public TrieNode[] children = new TrieNode[26];  
            public String item = "";  
              
            // Initialize your data structure here.  
            public TrieNode() {  
            }  
        }  
          
        class Trie {  
            private TrieNode root;  
          
            public Trie() {  
                root = new TrieNode();  
            }  
          
            // Inserts a word into the trie.  
            public void insert(String word) {  
                TrieNode node = root;  
                for (char c : word.toCharArray()) {  
                    if (node.children[c - 'a'] == null) {  
                        node.children[c - 'a'] = new TrieNode();  
                    }  
                    node = node.children[c - 'a'];  
                }  
                node.item = word;  
            }  
          
            // Returns if the word is in the trie.  
            public boolean search(String word) {  
                TrieNode node = root;  
                for (char c : word.toCharArray()) {  
                    if (node.children[c - 'a'] == null) return false;  
                    node = node.children[c - 'a'];  
                }  
                return node.item.equals(word);  
            }  
          
            // Returns if there is any word in the trie  
            // that starts with the given prefix.  
            public boolean startsWith(String prefix) {  
                TrieNode node = root;  
                for (char c : prefix.toCharArray()) {  
                    if (node.children[c - 'a'] == null) return false;  
                    node = node.children[c - 'a'];  
                }  
                return true;  
            }  
        }  
    View Code

     4 Add and Search Word

    public class WordDictionary {
    
        private TrieNode root = new TrieNode();
        // Adds a word into the data structure.
        public void addWord(String word) {
            // Write your code here
            TrieNode node = root;
            for (int i = 0; i < word.length(); i++){
                char c = word.charAt(i);
                if (node.children[c - 'a'] == null){
                    node.children[c - 'a'] = new TrieNode();
                }
                node = node.children[c - 'a'];
            }
            node.hasWord = true;
        }
    
        // Returns if the word is in the data structure. A word could
        // contain the dot character '.' to represent any one letter.
        public boolean search(String word) {
            // Write your code here
            return find(word, 0, root);
        }
        public boolean find(String word, int index, TrieNode now){
            if (index == word.length()){
                return now.hasWord;
            }
            char c = word.charAt(index);
            if (c == '.'){
                for (int i = 0; i < 26; i++){
                    if (now.children[i] != null){
                        if (find(word, index + 1, now.children[i])){
                            return true;
                        }
                    }
                }
                return false;
            } else if (now.children[c - 'a'] != null){
                return find(word, index + 1, now.children[c - 'a']);
            } else {
                return false;
            }
        }
    }
    
    class TrieNode{
        public TrieNode[] children;
        public boolean hasWord;
        public TrieNode(){
            children = new TrieNode[26];
            hasWord = false;
        }
    }
    View Code

    Scan-Line  区间拆分

    1 Number of Airplane in the sky

    class Solution {
        /**
         * @param intervals: An interval array
         * @return: Count of airplanes are in the sky.
         */
        public int countOfAirplanes(List<Interval> airplanes) { 
            // write your code here
            List<Point> list = new ArrayList<Point>();
            for (Interval i : airplanes){
                list.add(new Point(i.start, 1));
                list.add(new Point(i.end, 0));
            }
            Collections.sort(list, new Comparator<Point>() {
                public int compare(Point p1, Point p2) {
                    if (p1.time == p2.time) {
                        return p1.flag - p2.flag;
                    }
                    else {
                        return p1.time - p2.time;
                    }
                }
            });
            int count = 0, res = 0;
            for (Point p : list){
                if (p.flag == 1){
                    count++;
                } else{
                    count--;
                }
                res = Math.max(count, res);
            }
            return res;
        }
        
        
    }
    class Point{
        int time;
        int flag;
        Point(int time, int flag){
            this.time = time;
            this.flag = flag;
        }
    }
    View Code

    heap定义:

     java的 PriorityQueue是一个小顶堆,用于找最大前K个严肃。sort可重写。在本博客下面一个地方有详细介绍。

    1 Trapping Rain Water

    public int trapRainWater(int[] heights) 
    {
        if (heights == null || heights.length == 0)
        {
            return 0;
        }
        int res = 0;
        int l = 0;
        int r = heights.length - 1;
        int left_height = heights[l];
        int right_height = heights[r];
        while (l < r) {
            if (left_height < right_height) {
                l++;
                if (left_height > heights[l]) {
                    res += left_height - heights[l];
                } else {
                    left_height = heights[l];
                }
            } else {
                r--;
                if (right_height > heights[r]) {
                    res += right_height - heights[r];
                } else {
                    right_height = heights[r];
                }
            }
        }
        return res;
    }
    View Code

    2 Trapping Rain Water II

    public class Solution {
        /**
         * @param heights: a matrix of integers
         * @return: an integer
         */
        class Point{
            int x, y, h;
            public Point(int x, int y, int h) {
                this.x = x; this.y = y; this.h = h;
            }
        }
        public int trapRainWater(int[][] heights) {
            if (heights == null || heights.length == 0 || heights[0].length == 0) {
                return 0;
            }
            int m = heights.length;
            int n = heights[0].length;
            int[] dx = {0, 0, -1, 1};
            int[] dy = {-1, 1, 0, 0};
            int res = 0;
            Queue<Point> q = new PriorityQueue<>((p1, p2)->p1.h - p2.h);
            boolean[][] visited = new boolean[m][n];
            for (int i = 0; i < n; i++) {
                q.add(new Point(0, i, heights[0][i]));
                visited[0][i] = true;
                q.add(new Point(m - 1, i, heights[m - 1][i]));
                visited[m - 1][i] = true;           
            }
             for (int i = 0; i < m; i++) {
                q.add(new Point(i, 0, heights[i][0]));
                visited[i][0] = true;
                q.add(new Point(i, n -1, heights[i][n - 1]));
                visited[i][n - 1] = true;           
            }
            while (!q.isEmpty()) {
                Point p = q.poll();
                for (int k = 0; k < 4; k++) {
                    int newX = p.x + dx[k];
                    int newY = p.y + dy[k];
                    if (newX < 0 || newX >= m || newY < 0 || newY >= n || visited[newX][newY]) {
                        continue;
                    }
                    visited[newX][newY] = true;
                    q.add(new Point(newX, newY, Math.max(p.h, heights[newX][newY])));
                    res += Math.max(0, p.h - heights[newX][newY]);
                }
            }
            return res;
        }     
    }
    View Code

     3 Building Outline

        public List<int[]> getSkyline(int[][] build) {
            List<int[]> res = new ArrayList<>();
            List<int[]> point = new ArrayList<>();
            for (int i = 0; i < build.length; i++){
                point.add(new int[]{build[i][0], build[i][2]});
                point.add(new int[]{build[i][1], -build[i][2]});
            }
            Collections.sort(point, (a,b)->{
                if (a[0] == b[0]) return b[1] - a[1];
                return a[0] - b[0];
            });
            Queue<Integer> q = new PriorityQueue<>((a,b)->(b - a));
            int pre = 0, cur = 0;
            for (int[] p : point){
                if (p[1] > 0) {
                    q.offer(p[1]);
                    cur = q.peek();
                } else {
                    q.remove(-p[1]);
                    cur = q.isEmpty() ? 0 : q.peek();
                }
                if (pre != cur){
                    res.add(new int[]{p[0], cur});
                    pre = cur;
                }
            }
            return res;
        }
    View Code

     4 Heapify

       private void siftdown(int[] A, int k) {
    
            while (k < A.length) {
    
                int smallest = k;
    
                if (k * 2 + 1 < A.length && A[k * 2 + 1] < A[smallest]) {
    
                    smallest = k * 2 + 1;
    
                }
    
                if (k * 2 + 2 < A.length && A[k * 2 + 2] < A[smallest]) {
    
                    smallest = k * 2 + 2;
    
                }
    
                if (smallest == k) {
    
                    break;
    
                }
    
                int temp = A[smallest];
    
                A[smallest] = A[k];
    
                A[k] = temp;
    
                
    
                k = smallest;
    
            }
    
        }
    
        
    
        public void heapify(int[] A) {
    
            for (int i = A.length / 2; i >= 0; i--) {
    
                siftdown(A, i);
    
            } // for
    
        }
    View Code

    5 Data Stream Median

        public int[] medianII(int[] nums) {
            // write your code here
            Comparator<Integer> comp = new Comparator<Integer>(){
                public int compare(Integer left, Integer right) {
                    return right - left;
                }  
            };
            int len = nums.length;
            PriorityQueue<Integer> minQ = new PriorityQueue<>();
            PriorityQueue<Integer> maxQ = new PriorityQueue<>(comp);
            int[] res = new int[len];
            res[0] = nums[0];
            maxQ.add(nums[0]);
            for (int i = 1; i < len; i++) {
                int x = maxQ.peek();
                if (nums[i] < x) {
                    maxQ.add(nums[i]);
                } else {
                    minQ.add(nums[i]);
                }
                if (maxQ.size() > minQ.size() + 1){
                    minQ.add(maxQ.poll());
                } else if (minQ.size() > maxQ.size()){
                    maxQ.add(minQ.poll());
                }
                res[i] = maxQ.peek();
            }
            return res;
        }
    View Code

    6 Sliding Window Median   拆成两个步骤  1 加入一个元素,2删除一个元素, 求中位数

        public ArrayList<Integer> medianSlidingWindow(int[] nums, int k) {
            // write your code here
            ArrayList<Integer> res = new ArrayList<>();
            if (nums == null || nums.length == 0 || k <= 0) return res;
            PriorityQueue<Integer> max = new PriorityQueue<>((a,b)->(b - a));
            PriorityQueue<Integer> min = new PriorityQueue<>();
            int mid = nums[0];
            for (int i = 0; i < nums.length; i++) {
                if (i != 0) {
                    if (nums[i] > mid) {
                        min.add(nums[i]);
                    } else {
                        max.add(nums[i]);
                    }
                }
                if (i >= k) {
                    if (mid == nums[i - k]) {
                        if (max.size() > 0) {
                            mid = max.poll();
                        } else if (min.size() > 0) {
                            mid = min.poll();
                        }
                    } else if (mid > nums[i - k]) {
                        max.remove(nums[i - k]);
                    } else {
                        min.remove(nums[i - k]);
                    }
                }
                while (max.size() > min.size()) {
                    min.add(mid);
                    mid = max.poll();
                }
                while (min.size() > max.size() + 1) {
                    max.add(mid);
                    mid = min.poll();
                }
                if (i >= k - 1) {
                    res.add(mid);
                }
            }
            return res;
        }
    View Code

    7 sliding-window-maximum

        public ArrayList<Integer> maxSlidingWindow(int[] nums, int k) {
            // write your code here
            ArrayList<Integer> res = new ArrayList<>();
            if (nums == null || nums.length == 0 || k <= 0) {
                return res;
            }
            Deque<Integer> q = new ArrayDeque<Integer>();
            for (int i = 0; i < nums.length; i++) {
                while (!q.isEmpty() && nums[i] > q.peekLast()){
                    q.pollLast();
                }
                q.offer(nums[i]);
                if (i > k - 1 && q.peekFirst() == nums[i - k]) {
                    q.pollFirst();
                }
                if (i >= k - 1) {
                    res.add(q.peekFirst());
                }
            }
            r
  • 相关阅读:
    令Django 视图有默认 login_required
    sql语句 case
    java进制转换
    倒水问题
    全排列
    数据库范式
    操作系统——磁盘设备管理
    Windows系统安装MySQL
    Java题库——Chapter16 JavaFX UI组件和多媒体
    Java题库——Chapter15 事件驱动编程和动画
  • 原文地址:https://www.cnblogs.com/whesuanfa/p/7453591.html
Copyright © 2011-2022 走看看