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; }