zoukankan      html  css  js  c++  java
  • leetcode-5-basic

    解题思路:

    设两个变量land和sink,land的值是1的数量,sink表示内部的边。result = land*4-sink*2。按行扫描得到land,

    同时得到同一行中内部边的数目;然后按列扫描,得到同一列中内部边的数目。

    int islandPerimeter(vector<vector<int>>& grid) {
            int row = grid.size();
            int col = grid[0].size();
            int i;
            int j;
            int result = 0;
            int land = 0;
            int sink = 0;
            for (i = 0; i < row; i++) {
                for (j = 0; j < col; j++) {
                    if (grid[i][j] == 1) {
                        land ++;
                        if (j != col-1 && grid[i][j+1] == 1) {
                            sink ++;
                        }
                    }
                }
            }
            for (i = 0; i < col; i++) {
                for (j = 0; j < row; j++) {
                    if (grid[j][i] == 1) {
                        //land ++;
                        if (j != row-1 && grid[j+1][i] == 1) {
                            sink ++;
                        }
                    }
                }
            }
            result = 4 * land - 2 * sink;
            return result; 
        }
    

    解题思路:

    本来以为这道和上面差不多,不过其实不大一样。我的思路是,count存连续1的个数,curMax存count历史上的最大值。

    从nums[0]开始扫描到nums[size-2],分三种情况考虑:

    1) 0,1交界。此时要重置count。

    2) 1,0交界。此时count计数截止,可能需要更新curMax。

    3) 1,1交界。此时count+1。

    因为最后需要再判断一次curMax和count的大小关系(例如[0,1]这种,curMax还未获得赋值),但由于count是从1开始计的,

    如果还未扫描到1,如[0, 0]这种情况,那么返回的仍是count=1,显然不正确。所以加一个判断nums中是否有1的flag。对于

    下一位是1的情况设置为true。

    int findMaxConsecutiveOnes(vector<int>& nums) {
            //int result = 0;
            int curMax = 0;
            int count = 0;
            int size = nums.size();
            if (size == 1 && nums[0] == 1)
                return 1;
            if (size == 1 && nums[0] == 0 || size == 0)
                return 0;
            int i;
            // if 1 exits, true
            bool flag = false;
            count = 1;
            for (i = 0; i < size-1; i++) {
            // for 0,1
                if (nums[i] == 0 && nums[i+1] == 1) {
                    count = 1;
                    flag = true;
                    continue;
                }
            // for 1,0
                if (nums[i] == 1 && nums[i+1] == 0) {
                    if (count > curMax) {
                        curMax = count;
                        continue;
                    }
                }
            // for 1,1
                if (nums[i] == 1 && nums[i+1] == 1) {
                    count++;
                    flag = true;
                    continue;
                }
            }
            if (count > curMax && flag == true)
                curMax = count;
            return curMax;
        }
    

      

  • 相关阅读:
    视频:JDBCRDD源码及自定义JDBCRDD的分区策略
    聊聊spark-submit的几个有用选项
    线性求第k大
    汇编基础 第一章_总线
    长度不超过n的连续最大和___优先队列
    ISAP
    次小生成树
    k短路
    求出欧拉回路,欧拉路径
    拓扑排序bfs_dfs
  • 原文地址:https://www.cnblogs.com/pxy7896/p/6509973.html
Copyright © 2011-2022 走看看