leetcode 日记

1 63. Unique Paths II   带障碍物的路径计算

思路:dp[i][j] = 0 if grid[i][j] = 1 (障碍物)

再按照无障碍物的逻辑进行计算

int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int rows = obstacleGrid.size();
        if (rows == 0) {
            return 0;
        }
        int cols = obstacleGrid[0].size();
        vector<vector<int>> ways(rows, vector<int> (cols, 1));
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                if (obstacleGrid[i][j] == 1) {
                    ways[i][j] = 0;
                } else {
                    if (i == 0 && j == 0) {
                        ways[i][j] = 1;
                    } else if (i == 0) {
                        ways[i][j] =  ways[i][j - 1];
                    } else if (j == 0) {
                        ways[i][j] = ways[i - 1][j];
                    } else {
                        ways[i][j] = ways[i - 1][j] + ways[i][j - 1];
                    }
                }
            }
        }
        return ways[rows - 1][cols - 1];
    }

2 矩阵的环形遍历

方法:(1)设置rowStart,rowEnd,colStart,colEnd四个变量来指示当前轮遍历的起始位置

     (2) 按照顺时针方向进行遍历,一轮遍历分成四次循环,每一次循环完成,终点或起点需要缩进一个单位(start + 1,end -1)

注意:当矩阵不是方阵时,需要在每一轮向左和向上遍历之前进行一次判断,否则会造成重复。

vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if (matrix.size() == 0) {
            return {};
        }
        int rowStart = 0;
        int rowEnd = matrix.size() - 1;
        int colStart = 0;
        int colEnd = matrix[0].size() - 1;
        vector<int> order;
        while (rowStart <= rowEnd && colStart <= colEnd) {
            for (int j = colStart; j <= colEnd; j++) {
                order.push_back(matrix[rowStart][j]);
            }
            rowStart++;
            for (int i = rowStart; i <= rowEnd; i++) {
                order.push_back(matrix[i][colEnd]);
            }
            colEnd--;
            if (rowStart <= rowEnd) { //注意此处
                for (int j = colEnd; j >= colStart; j--) {
                    order.push_back(matrix[rowEnd][j]);
                }
                rowEnd--;
            }
            if (colStart <= colEnd) {//注意此处
                for (int i = rowEnd; i >= rowStart; i--) {
                    order.push_back(matrix[i][colStart]);
                }
                colStart++;
            }
        }
        return order;
    }

时间: 2024-10-19 09:59:11

leetcode 日记的相关文章

python leetcode 日记 --Contains Duplicate II --219

题目: Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nums[j] and the difference between i and jis at most k. 给定一个整形数组和一个整数型数k,找出在这个数组中是否存在两个相同的数,并且这两个数的下标的距离小于k. "&q

LeetCode日记3

(2015/11/3) LeetCode-36 Valid Sudoku:(easy) 1)使用数据结构 set<char> emptyset; vector<set<char>> mp(27, emptyset); 2)下标0-8存储行中的数字,9-17存储列中的数字,18-26存储3×3块中数字. 3)双重for循环中,i表示行,9 + j表示列,18 + i / 3 + 3 * (j / 3)表示块. (2015/11/12) LeetCode-38 Count

leetcode 日记 4sum java

整体思路同之前的一样,依然采取降低维度的方式进行 public List<List<Integer>> solution(int nums[], int target) { List<List<Integer>> result = new ArrayList<>(); if((nums.length<4)||(nums==null)) { return result; } Arrays.sort(nums); if ((4*nums[0]&

python leetcode 日记--Maximal Square--221

题目: Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area. For example, given the following matrix: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 Return 4. 本题为一个典型的动态规划问题,因此可以使用动态规划的思想进行. step1,初始化

python leetcode 日记--231. Power of Two

题目: Given an integer, write a function to determine if it is a power of two. class Solution(object): def isPowerOfTwo(self, n): # """ :type n: int :rtype: bool """ 方法:分析2的幂次方的特点,发现2的任意次方的数,化成二进制时只有首位为1其余位为0,因此我的解决方法如下: class

leetcode 日记 162. Find Peak Element java python

根据题目可知,输入为:一个相邻元素不相等的数列,输出为:其中一个(上)峰值的序号.并且要求时间复杂度为logn 分析:由于题目要求时间复杂度为logn,因此不能进行全部遍历.又因为只需要找到其中的一个峰值,那么,每次对半分,便可以达到logn的复杂度. 根据对半分的思路继续想,不难发现只要确定了中间位置的数是处在上升阶段还是下降阶段,就可以确定在某一侧必有一个峰值. 往复多次,即可找出两个点,其中一个一定处于某一个峰值上. java代码: 1 public int findPeakElement

leetcode 日记 3sumclosest java

整体思路为将threeSum将为twoSum即可 public int solution(int[] nums, int target) { if (nums.length == 3) { return nums[0] + nums[1] + nums[2]; } else { Arrays.sort(nums); int r = 10000;//此两处10000为省事而设,如果严谨应该大致找到其中的一个较大距离 int distance = 10000; for (int i = 0; i <

2017/11/3 Leetcode 日记

654. Maximum Binary Tree Given an integer array with no duplicates. A maximum tree building on this array is defined as follow: The root is the maximum number in the array.(根节点是数组中的最大值) The left subtree is the maximum tree constructed from left part

LeetCode单排日记

初衷 之前有研究过一段时间数据结构与算法,但平时使用的不多,就连排序都很少用(自从JDK8有了Stream,就再也没有手写排序了.),所谓用进废退,时至今日,能记住的已经不多了,还记得之前有一次面试,面试官要求写一个快速排序,结果突然记不起来该怎么写了,于是交了一个插入排序... 为了在数据结构与算法方面不至于太辣鸡,特此开一个坑,每天刷一刷LeetCode上的算法题,也顺便把相关的数据结构和算法做一个复习. 如果你也刚好有兴趣一起学习的话,那在这条路上,我能与你作伴. 关于LeetCode L