Day 40

第130题:

给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。

找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。(来自LeetCode)

1、分析二维矩阵内的哪一部分 O 是被包围的呢;

  其实二维矩阵内有三种类型的字符:第一种是 X ,第二种是被包围的 O ,第三种是没有被包围的 O;

  如果我们需要把被包围的 O 变成 X ,可以转换思路,寻找没有被包围的 O ,然后对这些 O 做上标记;

  再遍历二维矩阵,将矩阵内没有标记的 O 变为 X。

  其中没有被包围的 O 一定存在矩阵的边缘或者和矩阵边缘的 O 相邻,我们只需要遍历矩阵的上下左右四边的位置;

  如果是 O ,将这个 O 变成 A (相当于做标记),再遍历这个位置上下左右是否存在 O ;

  只要有,那它肯定不是被包围的 O ,也变成 A ,这样就可以找出所有的不被包围的 O ;

  最后遍历矩阵,将 A 变回 O ,把 O 变成 X 即可。

  

第122题:

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。来源:力扣(LeetCode)

1、为求最大收益,就是把每一次可以得到的收益都累计起来;

  那么当我们买入一只A,遍历下一个B,涨了,卖出,得到收益profit1;

  然后可以看作把卖出的又买回来B,再遍历下一个C,如果没有涨,我们就将手中B的卖出,买下一个C;

  那么这样就相当于把内部的所有利润都累计起来,得出最大利润profit。

  

 2、也可以利用dp[x][y]数组判断此时的持有物(股票或者现金)和此时手中的收益;

  x表示此时手中的收益(可为负数),y表示持有现金或者股票(0:现金,1:股票);

  一开始dp[0][0]表示还没有开始交易,且持有现金;

  当买入第一支股票(价值1)后,就改为dp[-1][1];

  然后遍历整个数组,得出每个位置买入或者卖出后的转台存入dp数组;

  最终得出最大值。

  

第136题:

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗。来源:力扣(LeetCode)

 1、遍历数组,将元素和元素的个数存入hash表,然后遍历hash表,得出个数为1的元素。

  

2、利用亦或性质,数组中的全部元素的异或运算结果即为数组中只出现一次的数字。

  

 

class Solution {    public int singleNumber(int[] nums) {        Map<Integer, Integer> map = new HashMap<>();        for (Integer i : nums) {            Integer count = map.get(i);            count = count == null ? 1 : ++count;            map.put(i, count);        }        for (Integer i : map.keySet()) {            Integer count = map.get(i);            if (count == 1) {                return i;            }        }        return -1; // can't find it.    }}
作者:yinyinnie链接:https://leetcode-cn.com/problems/single-number/solution/xue-suan-fa-jie-guo-xiang-dui-yu-guo-cheng-bu-na-y/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/liang-yi-/p/13488281.html