zoukankan      html  css  js  c++  java
  • 九章强化

    第一周

     三角形个数。

        public int triangleCount(int s[]) {
            // write your code here
            if (s == null || s.length == 0) return 0;
            int res = 0;
            Arrays.sort(s);
            for (int i = 0; i < s.length; i++){
                int left = 0;
                int right = i - 1;
                while (left < right){
                    if (s[left] + s[right] > s[i]){
                        res+=right - left;
                        right--;
                    } else{
                        left++;
                    }
                }
            }
            return res;
        }
    View Code

    第二周

    并查模版

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

     无向图的联通块

    public class UserServiceImpl {
    
        public void addUser(){
            System.out.println("addUser");
        }
        
        public List<List<Integer>> connectedSet(ArrayList<UndirectedGraphNode> nodes) {
            
            HashSet<Integer> set = new HashSet<>();
            for (UndirectedGraphNode node : nodes){
                set.add(node.label);
            }
            
            Union union = new Union(set);
            for (UndirectedGraphNode node : nodes){
                for (UndirectedGraphNode neighbor : node.neighbors){
                    union.union(node.label, neighbor.label);
                }
            }
            
            List<List<Integer>> res = new ArrayList<>();
            HashMap<Integer, List<Integer>> all = new HashMap<>();
            for (UndirectedGraphNode node : nodes){
                Integer curfather = union.find(node.label);
                if (!all.containsKey(curfather)){
                    all.put(curfather, new ArrayList<Integer>());
                }
                all.get(curfather).add(node.label);
            }
            for (List<Integer> list : all.values()){
                res.add(list);
            }
            return res;
            
        }
    }
    
    class UndirectedGraphNode {
         int label;
         ArrayList<UndirectedGraphNode> neighbors;
         UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
    };
    class Union{
        HashMap<Integer, Integer> map = new HashMap<>();
        
        public Union(HashSet<Integer> set){
            for (int now : set){
                map.put(now, now);
            }
        }
        
        public int find(int x){
            int r = map.get(x);
            while (r != map.get(r)){
                r = map.get(r);
            }
            
            int j = x, i;
            while (j != r){
                i = map.get(j);
                map.put(j, r);
                j = i;
            }
            return r;
        }
        
        public void union(int x, int y){
            int fx = map.get(x), fy = map.get(y);
            if (fx != fy){
                map.put(fx, fy);
            }
        }
    }
    View Code

    找小鸟数

    Given a boolean 2D matrix, find the number of islands.
    
     Notice
    
    0 is represented as the sea, 1 is represented as the island. If two 1 is adjacent, we consider them in the same island. We only consider up/down/left/right adjacent.
    
    Have you met this question in a real interview? Yes
    Example
    Given graph:
    
    [
      [1, 1, 0, 0, 0],
      [0, 1, 0, 0, 1],
      [0, 0, 0, 1, 1],
      [0, 0, 0, 0, 0],
      [0, 0, 0, 0, 1]
    ]
    View Code
        public int numIslands(char[][] grid) {
            if (grid == null || grid.length == 0) return 0;
            int res = 0;
            for (int i = 0; i < grid.length; i++){
                for (int j = 0; j < grid[0].length; j++){
                    if (grid[i][j] == '1'){
                        res++;
                        remove(grid, i, j);
                    }
                }
            }
            return res;
        }
        public void remove(char[][] grid, int i, int j){
            if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == '0') return;
            grid[i][j] = '0';
            remove(grid, i - 1, j);
            remove(grid, i + 1, j);
            remove(grid, i, j - 1);
            remove(grid, i, j + 1);
        }
    View Code

    算小鸟数2

    岛屿的个数II
    
     描述
     笔记
     数据
     评测
    给定 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 UserServiceImpl {
    
        public void addUser(){
            System.out.println("addUser");
        }
        public int converToId(int x, int y, int m){
            return x * m  + y;
        }
         public List<Integer> numIslands2(int n, int m, Point[] operators) {
             List<Integer> res = new ArrayList<>();
             if (operators == null) {
                 return res;
             }
             int[] dx = {0, 0, 1, -1};
             int[] dy = {1, -1, 0, 0};
             
             int count = 0;
             Union union = new Union(n, m);
             int[][] island = new int[n][m];
             for (int i = 0; i < operators.length; i++){
                 count++;
                 int x = operators[i].x;
                 int y = operators[i].y;
                 if (island[x][y] != 1){
                     island[x][y] = 1;
                     int id = converToId(x, y, m);
                     for (int j = 0; j < 4; j++){
                         int newX = x + dx[j];
                         int newY = y + dy[y];
                         if (newX >= 0 && newX < n && newY >= 0 && newY < m && island[newX][newY] == 1){
                             int newId = converToId(newX, newY, m);
                             int fa = union.find(id);
                             int newfa = union.find(newId);
                             if (fa != newfa){
                                 count--;
                                 union.union(fa, newfa);
                             }
                         }
                     }
                 }
                 res.add(count);
             }
             return res;
         }
        
     class Point {
          int x;
          int y;
          Point() { x = 0; y = 0; }
          Point(int a, int b) { x = a; y = b; }
    }
    class Union{
        HashMap<Integer, Integer> map = new HashMap<>();
        
        public Union(int n, int m){
            for (int i = 0; i < n; i++){
                for (int j = 0; j < m; j++){
                    map.put(converToId(i, j, m), converToId(i, j, m));
                }
            }
        }
        
        public int converToId(int x, int y, int m){
            return x * m  + y;
        }
        public int find(int x){
            int r = map.get(x);
            while (r != map.get(r)){
                r = map.get(r);
            }
            
            int j = x, i;
            while (j != r){
                i = map.get(j);
                map.put(j, r);
                j = i;
            }
            return r;
        }
        
        public void union(int x, int y){
            int fx = map.get(x), fy = map.get(y);
            if (fx != fy){
                map.put(fx, fy);
            }
        }
    }
    }
    View Code

     图是否是树

    复制代码
    
    给出 n 个节点,标号分别从 0 到 n - 1 并且给出一个 无向 边的列表 (给出每条边的两个顶点), 写一个函数去判断这张`无向`图是否是一棵树
    
     注意事项
    
    你可以假设我们不会给出重复的边在边的列表当中. 无向边 [0, 1] 和 [1, 0] 是同一条边, 因此他们不会同时出现在我们给你的边的列表当中。
    
    您在真实的面试中是否遇到过这个题? Yes
    样例
    给出n = 5 并且 edges = [[0, 1], [0, 2], [0, 3], [1, 4]], 返回 true.
    
    给出n = 5 并且 edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]], 返回 false.
    
    标签 
    相关题目 
    View Code
    public class Solution {
        /**
         * @param n an integer
         * @param edges a list of undirected edges
         * @return true if it's a valid tree, or false
         */
        public boolean validTree(int n, int[][] edges) {
            // Write your code here
            if (edges == null || edges.length == 0 || n == 0) return;
            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){
            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
    Number of Airplanes 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
    描述
     笔记
     数据
     评测
    给出飞机的起飞和降落时间的列表,用 interval 序列表示. 请计算出天上同时最多有多少架飞机?
    
     注意事项
    
    如果多架飞机降落和起飞在同一时刻,我们认为降落有优先权。
    
    您在真实的面试中是否遇到过这个题? Yes
    样例
    对于每架飞机的起降时间列表:[[1,10],[2,3],[5,8],[4,7]], 返回3。
    View Code

    第三周

    左右指针‘

    ’1,灌水

    接雨水
    
     描述
     笔记
     数据
     评测
    给出 n 个非负整数,代表一张X轴上每个区域宽度为 1 的海拔图, 计算这个海拔图最多能接住多少(面积)雨水。
    
    接雨水
    
    您在真实的面试中是否遇到过这个题? Yes
    样例
    如上图所示,海拔分别为 [0,1,0,2,1,0,1,3,2,1,2,1], 返回 6.
    
    挑战 
    View Code
        /**
         * @param heights: an array of integers
         * @return: a integer
         */
        public int trapRainWater(int[] heights) {
            // write your code here
            if (null == heights || heights.length == 0) {
                return 0;
            }
            int ans = 0;
            int start = 0;
            int end = heights.length - 1;
            while (start < end) {
                if (heights[start] < heights[end]) {
                    int smaller = heights[start];
                    while (start < end && heights[start] <= smaller) {
                        ans += smaller - heights[start];
                        start++;
                    }
                } else {
                    int smaller = heights[end];
                    while (start < end && heights[end] <= smaller) {
                        ans += smaller - heights[end];
                        end--;
                    }
                }
            }
            return ans;
        }
    }
    View Code

    2 灌水 407 leet

      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;
            PriorityQueue<Cell> pq = new PriorityQueue<>((v1,v2)->v1.h - v2.h);
            boolean[][] visited = new boolean[m][n];
            for (int i = 0; i < n; i++){
                visited[0][i] = true;
                pq.offer(new Cell(0, i, heights[0][i]));
                visited[m - 1][i] = true;
                pq.offer(new Cell(m - 1, i, heights[m-1][i]));
            }
            for (int i = 0; i < m; i++){
                visited[i][0] = true;
                pq.offer(new Cell(i, 0, heights[i][0]));
                visited[i][n - 1] = true;
                pq.offer(new Cell(i, n - 1, heights[i][n-1]));
            }
            int[] dx = {0, 0, 1, -1};
            int[] dy = {1, -1, 0, 0};
            int res = 0;
            while (!pq.isEmpty()){
                Cell cell = pq.poll();
                for (int i = 0; i < 4; i++){
                    int newX = cell.x + dx[i];
                    int newY = cell.y + dy[i];
                    if (newX >= 0 && newX < m && newY >= 0 && newY < n && !visited[newX][newY]){
                        visited[newX][newY] = true;
                        pq.offer(new Cell(newX, newY, Math.max(cell.h, heights[newX][newY])));
                        res += Math.max(0, cell.h - heights[newX][newY]);
                    }
                }
            }
            return res;
        }
        class Cell{
            int x, y , h;
            Cell(int x, int y, int h){
                this.x = x; this.y = y; this.h = h;
            }
    View Code

     2 房子轮廓

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

     3 堆化

        public void heapify(int[] A) {
            // write your code here
            for (int i = A.length / 2; i >= 0; i--){
                shiftdown(A, i);
            }
        }
        public void shiftdown(int[] a, int k){
            while (k < a.length){
             int small = k;
            if (k * 2 + 1 < a.length && a[k * 2 + 1] < a[small]){
                small = k * 2 + 1;
            }
            if (k * 2 + 2 < a.length && a[k * 2 + 2] < a[small]){
                small = k * 2 + 2;
            }
            if (small == k){
                break;
            }
            int temp = a[k];
            a[k] = a[small];
            a[small] = temp;
            k = small;
            }
        }
    View Code

    4 Data Stream Median

    数据流中位数

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

    5 滑动窗口中位数

        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;
            int i = 0, j = 0, find = 0;
            List<Integer> list = new ArrayList<>();
            for (; i < k - 1; i++){
                list.add(nums[i]);
            }
            for (; i < nums.length; i++){
                list.add(nums[i]);
                Collections.sort(list);
                res.add(list.get((k - 1 )/ 2));
                for (int f = 0; f < list.size() && j < nums.length; f++){
                    if (list.get(f) == nums[j]){
                        find = f;
                        break;
                    }
                }
                list.remove(find);
                j++;
            }
            return res;
        }
    View Code

    6滑动窗口最大 239

    public class Solution {
        public int[] maxSlidingWindow(int[] nums, int k) {
            if (nums == null || nums.length == 0 || k <= 0){
                return new int[0];
            }
            int[] res = new int[nums.length - k + 1];
            int index = 0;
            Deque<Integer> q = new ArrayDeque<>();
            for (int i = 0; i < nums.length; i++){
                if (!q.isEmpty() && q.peek() == i - k){
                    q.poll();
                }
                while (!q.isEmpty() && nums[q.peekLast()] < nums[i]){
                    q.pollLast();
                }
                q.add(i);
                if (i >= k - 1){
                    res[index++] = nums[q.peek()];
                }
            }
            return res;
        }
    }
    View Code

    第四周  双指针

    Nuts 和 Bolts 的问题
        public void sortNutsAndBolts(String[] nuts, String[] bolts, NBComparator compare) {
            // write your code here
            for (int i = 0; i < nuts.length; i++){
                for (int j = i; j < bolts.length; j++){
                    if (compare.cmp(nuts[i], bolts[j]) == 0){
                        String item = bolts[j];
                        bolts[j] = bolts[i];
                        bolts[i] = temp;
                        break;
                        
                    }
                }
            }
        }
    View Code
        public void sortNutsAndBolts(String[] nuts, String[] bolts, NBComparator compare) {
            // write your code here
            sort(nuts, bolts, 0, nuts.length - 1; compare);
        }
        public void sort(string[] nuts, String[] bolts, int l, int h, NBComparator compare){
            if (l < h){
                int p = partion(nuts, l, h, bolts[h], compare);
                partion(bolts, l, h, nuts[p]);
                sort(nuts, bolts, l, p, compare);
                sort(nuts, bolts, p + 1, h, compare);
            }
        }
        public int partion(String[] strs, int l, int h, String str, NBComparator compare){
            for (int i = l; i <= h; i++){
                if (compare(strs[i], str) == 0 || compare(str, strs[i]) == 0){
                    swap(strs, i, l);
                    break;
                }
            }
            String now = strs[l];
            int left = l, right = r;
            while (left < right){
                while (compare(strs[right], str) == -1 || compare(str, strs[right]) == 1){
                    right--;
                }
                strs[left] = strs[right];
                while (compare(strs[left], str) == -1 || compare(str, strs[left]) == 1){
                    left++;
                }
            }
            strs[left] = now;
            return left;
        }
        public void swap(String[] strs, int l, int r){
            String item = strs[l];
            strs[l] = strs[r];
            strs[r] = item;
        }
    View Code

    leetCode 209  Minimum Size Subarray  双指针

        public int minSubArrayLen(int s, int[] nums) {
            if (nums == null || nums.length == 0) return 0;
            int i = 0, j = 0, sum = 0, min = Integer.MAX_VALUE;
            while (j < nums.length)
            {
                sum += nums[j++];
                while (sum >= s)
                {
                    min = Math.min(min,  j - i);
                    sum -= nums[i];
                    i++;
                }
            }
            return min == Integer.MAX_VALUE ? 0 : min;
        }
    View Code
    3. Longest Substring Without Repeating Characters 
        public int lengthOfLongestSubstring(String s) {
            if (s == null || s.length() == 0) return 0;
            Set<Character> set = new HashSet<>();
            int i = 0, j = 0, max = 0;
            while (j < s.length())
            {
                char c = s.charAt(j);
                if (!set.contains(c))
                {
                    set.add(c);
                    j++;
                    max = Math.max(set.size(), max);
                }else
                {
                    set.remove(s.charAt(i++));
                }
            }
            return max;
        }
    View Code

    leetcode 304  最长的k个字符

        public int lengthOfLongestSubstringKDistinct(String s, int k) {
            if (s == null || s.length() == 0 || k <= 0) return 0;
            HashMap<Character, Integer> map = new HashMap<>();
            int j = 0;
            int max = Integer.MAX_VALUE;
            for (int i = 0; i < s.length(); i++) {
                while (j < s.length()) {
                    char c = s.charAt(j);
                    if (map.containsKey(c)) {
                        map.put(c, map.get(c) + 1);
                    } else {
                        if (map.size() == k) {
                            break;
                        }
                        map.put(c, 1);
                    }
                j++;
                }
                if (map.size() <= k) {
                    max = Math.max(max, j - i);
                }
                if (map.get(s.charAt(i)) == 1) {
                    map.remove(s.charAt(i));
                } else {
                    map.put(s.charAt(i), map.get(s.charAt(i)) - 1);
                }
            }
            return max;
        }
    View Code

     第五周  动态规划

    1 lintCode huose rabber  打劫房屋

        public long houseRobber(int[] a) {
            // write your code here
            if (a == null || a.length == 0) return 0;
            if (a.length == 1) return (long)a[0];
            if (a.length == 2) return (long)Math.max(a[0], a[1]);
            long[] res = new long[2];
            res[0] = (long)a[0]; res[1] = (long)Math.max(a[0], a[1]);
            for (int i = 2; i < a.length; i++){
                res[i%2] = Math.max(res[(i-1)%2], res[(i-2)%2] + a[i]);
            }
            return res[(a.lenth - 1) % 2];
         }
    View Code

    2 lintCode  打劫房屋2

        public int houseRobber2(int[] nums) {
            // write your code here
            if (nums == null || nums.length == 0) return 0;
            if (nums.length == 1) return nums[0];
            if (nums.length == 2) return Math.max(nums[0], nums[1]);
            int[] a1 = new int[nums.length - 1];
            int[] a2 = new int[nums.length - 1];
            for (int i = 0; i < nums.length - 1; i++){
                a1[i] = nums[i];
            }
            for (int i = 1; i < nums.length; i++){
                a2[i - 1] = nums[i];
            }
            return Math.max(houseRobber(a1), houseRobber(a2));
        }
        public int houseRobber(int[] nums){
            int[] dp = new int[2];
            dp[0] = nums[0];
            dp[1] = Math.max(nums[0], nums[1]);
            for (int i = 2; i < nums.length; i++){
                dp[i % 2] = Math.max(dp[(i - 1) % 2], dp[(i - 2) % 2] + nums[i]);
            }
            return dp[(nums.length - 1) % 2];
        }
    View Code

    3 爬楼梯

    4 221 Maximal Square

        public int maximalSquare(char[][] matrix) {
            if(matrix.length == 0) return 0;
            int m = matrix.length, n = matrix[0].length, res = 0;
            int[][] dp = new int[m + 1][n + 1];
            for (int i = 1; i <= m; i++)
            {
                for (int j = 1; j <= n; j++)
                {
                    if (matrix[i - 1][j - 1] == '1')
                    {
                        dp[i][j] = Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1])) + 1;
                        res = Math.max(res, dp[i][j]);
                    }
                }
            }
            return res*res;
        }
    View Code

    5 300 longest Increasng subseq

       public int longestIncreasingSubsequence(int[] nums) {
            // write your code here
            if (nums == null || nums.length == 0) return 0;
            int[] dp = new int[nums.length];
            int max = 0;
            for (int i = 0; i < nums.length; i++){
                dp[i] = 1;
                for (int j = 0; j < i; j++){
                    if (nums[j] < nums[i]){
                        dp[i] = Math.max(dp[i], dp[j] + 1);
                    }
                    max = Math.max(max, dp[i]);
                }
            }
            return max;
        }
    View Code

    6 二位数组,最长上升子序列 329

    public class Solution {
        int[] dx = {0, 0, 1, -1};
        int[] dy = {1, -1, 0, 0};
        int m = 0;
        int n = 0;
        public int longestIncreasingPath(int[][] matrix) {
            if (matrix.length == 0) return 0;
            m = matrix.length;
            n = matrix[0].length;
            int max = 0;
            int[][] cat = new int[m][n];
            for (int i = 0; i < m; i++){
                for (int j = 0; j < n; j++){
                    cat[i][j] = dfs(matrix, cat, i, j);
                    max = Math.max(cat[i][j], max);
                }
            }
            return max;
        }
        public int dfs(int[][] matrix, int[][] cat, int x, int y){
            if (cat[x][y] != 0) return cat[x][y];
            int max = 1;
            for (int i = 0; i < 4; i++){
                int nx = dx[i] + x;
                int ny = dy[i] + y;
                if (nx >= 0 && nx < m && ny >= 0  && ny < n && matrix[nx][ny] > matrix[x][y]){
                    int len = 1 + dfs(matrix, cat, nx, ny);
                    max = Math.max(max, len);
                }
            }
            cat[x][y] = max;
            return max;
        }
    View Code

    7 coins in a line

        public boolean firstWillWin(int n) {
            // write your code here
            if (n % 3 == 0) return false;
            return true;
        }
    View Code

    8 coins in a line 2

       public boolean firstWillWin(int[] values) {
            // write your code here
            if (values.length <= 2) return true;
            int m = values.length;
            int[] dp = new int[m + 1];
            dp[m] = 0;
            dp[m - 1] = values[m - 1];
            dp[m - 2] = values[m - 1] + values[m - 2];
            dp[m - 3] = values[m - 3] + values[m - 2];
            for (int i = m - 4; i >= 0; i--){
                dp[i] = Math.max(values[i] + Math.min(dp[i+2],dp[i+3]),
                                 values[i] + values[i+1] + Math.min(dp[i+3], dp[i+4]));
            }
            int sum = 0;
            for (int i : values){
                sum += i;
            }
            int sec = sum - dp[0];
            return dp[0] > sec;
        }
    View Code

    9 coins in a line 3

    10 374 375 guss number height ro low

    11 最大子数组 53

        public int maxSubArray(int[] nums) {
            int maxsum = nums[0], thissum = nums[0];
            for (int i = 1; i < nums.length; i++) {
                thissum = Math.max(thissum + nums[i], nums[i]);
                maxsum = Math.max(thissum, maxsum);
            }
            return maxsum;
        }
    View Code

    12 最大连乘 152

        public int maxProduct(int[] nums) {
            if (nums == null || nums.length == 0) return 0;
            if (nums.length == 1) return nums[0];
            int max = nums[0], min = nums[0], maxg = nums[0];
            for (int i = 1; i < nums.length; i++)
            {
                int a = max * nums[i];
                int b = min * nums[i];
                max = Math.max(nums[i], Math.max(a, b));
                min = Math.min(nums[i], Math.min(a, b));
                maxg = Math.max(max, maxg);
            }
            return maxg;
        }
    View Code

    第六周 动态规划

    1 石头归并

    2 爆炸气球

    3  背包问题

     第七周 、

    寻找峰值

        public int findPeak(int[] a) {
            // write your code here
            if (a == null && a.length < 3) return -1;
            int l = 1, r = a.length - 2;
            while (l <= r){
                int m = (r - l) / 2 + l;
                if (a[m] > a[m - 1] && a[m] > a[m + 1]) return m;
                if (a[m - 1] > a[m]) r = m - 1;
                else l = m + 1;
            }
            return -1;
        }
    View Code

    寻找峰值2

        public int findPeak(int[] a) {
            // write your code here
            if (a == null && a.length < 3) return -1;
            int l = 1, r = a.length - 2;
            while (l <= r){
                int m = (r - l) / 2 + l;
                if (a[m] > a[m - 1] && a[m] > a[m + 1]) return m;
                if (a[m - 1] > a[m]) r = m - 1;
                else l = m + 1;
            }
            return -1;
        }
        public List<Integer> findPeakII(int[][] a) {
        
            List<Integer> res = new ArrayList<>();
            int l = 1, r = a.length - 2;
            while (l <= r){
                int mid = (l + r) / 2;
                int col = findPeak(a[m]);
                if (a[mid][col] > a[mid + 1][col] && a[mid][col] > a[mid - 1][col]){
                    res.add(mid);
                    res.add(col);
                } 
                if (a[mid][col] < a[mid+1][col]){
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
            return -1;
        }
    View Code

    子数组和  和为0 的全部数组

    和为0 的子矩阵

        public int[][] submatrixSum(int[][] matrix) {
            // Write your code here
            int[][] res = new int[2][2];
            if (matrix == null || matrix.length == 0) return res;
            int m = matrix.length, n = matrix[0].length;
            int[][] sum = new int[m + 1][n + 1];
            for (int i = 0; i < m; i++){
                for (int j = 0; j < n; j++){
                    sum[i + 1][j + 1] = matrix[i][j] + sum[i + 1][j] + sum[i][j + 1] - sum[i][j];
                }
            }
            for (l = 0; l < m; l++){
                for (h = l + 1; h <= m; h++){
                    HashMap<Integer, Integer> map = new HashMap<>();
                    for (int col = 0; col <= n; col++){
                        int diff = sum[h][col] - sum[l][col];
                        if (map.containsKey(diff)){
                            int k = map.get(diff);
                            result[0][0] = l;   result[0][1] = k;
                            result[1][0] = h-1; result[1][1] = col-1;
                            return res;
                        }else {
                            map.put(diff, col)
                        }
                    }
                }
            }
            return res;
        }
    View Code
  • 相关阅读:
    docker 知识汇总1-镜像管理
    合并两个git repository
    这一次, 信报箱震惊世界
    python实现括号分组
    linux case菜单代码示例
    oracle 11gR2 client安装(Red Hat Enterprise Linux Server release 5.5 (Tikanga) 安装ORACLE客户端)
    SYSAUX表空间过大处理
    SYSAUX表空间大于33G问题处理
    window 给链接加下划线或取消下划线
    ORACLE11G_win32监听程序不支持服务
  • 原文地址:https://www.cnblogs.com/whesuanfa/p/7040252.html
Copyright © 2011-2022 走看看