我的leetcode每日A题

来源:互联网 发布:paparecipe正品软件 编辑:程序博客网 时间:2024/05/22 11:40
----3.12----
(1)Largest Rectangle in Histogram (最大直方图面积)
<解法一>
栈解法
<解法二>
left right解法
(2)Rectangle Area  (矩形面积总和)
矩阵面积,根据坐标的最大最小位置进行overlap大小的判断
(3)Maximal Rectangle(01矩阵的最大联通面积)
参考Rectangle Area调用,从下往上建立小的rectangle,求解

----3.13----
(1)Bulb Switcher (n个灯泡一次按照1,2,3,4...n的倍数开关,问最后剩余多少个灯泡亮着)
sqrt(n)下取整。
因为只有完全平方数有奇数个因子,所以最后会亮着,其他的都关了。

(2)Palindrome Number (回文数)
给定一个数字判断它是不是回文数
    解法一
    首先负数不是回文数
    最简单的就是反向从最后一位开始按照秦九韶算法求值。
    然后看求得数值和原始的是否一致
    解法二
    revhalf-revesed half 解法,快慢指针分别除以10和100,如果得到的revhalf和慢指针一样或者10倍关系

(3)Bulls and Cows
给定两个数字字符串(Secret和Guess),计算位置和数值都相同的数目(Bulls)和数值相同位置不同的数目(Cows)
    首先Bulls很容易计算
    把Secret中除了Bulls之外的进行Hash(unordered_map)
    针对除了Bulls的那些进行循环遍历看是不是在Hash中,在的话hash_count--,Cows++

(4)Roman To Integer
//罗马数字规则
        //(1) I:1 V:5 X:10 L:50 C:100 D:500 M:1000
        //      重复表示直接相加
        //(2) 从左到右,如果左边比右边大则进行相加
        //(3) 如果左边比右边小,则右边减左边,其中左边的数只能是 I X C
      只能相邻的进行相减,比如 IV IX XL XC CD CM
        //(4) 正常重复不超过3次 如III IX XI
        //(5) 上面加一条横线表示增值1000倍

从左到右遍历,如果当前小于左边数,直接相加;如果当前大于左边数,减去左边数*2,
因为左边数已经加过一遍了,当前两个联合表示相当于右边减左边。

(5)Integer To Roman
        与上面类似,但是思考起来更难一些不那么直观
将M D C L X V I 和他们的组合 CM CD XC XL IX IV生成表格
即M:1000 CM:900 D:500 CD:400 C:100 XC:90 L:50 XL:40 X:10 IX:9 V:5 IV:4 I:1

将这个表从大到小进行扫描,大于等于当前罗马则输出,当前数值相减,直至减到0为止。

----3.14----
(1)Search for a Range 在有序数组中查找一个target对应的数
解法一
先从左边开始查找,右边无限往左靠近nums[mid]>=target right--;
然后右边开始查找,左边无限往右靠近nums[mid]<=target left++;
while(left<=right)
解法二
普通的二分 left++ right--,如果nums[mid]==target,则重新写一个二分查找的函数,只在一侧进行查找
因为有一侧肯定是target,所以只需要从另一侧无限逼近即可。


(2)Search Insert Position 寻找数或者插入位置
排好序的数组,如果找到则返回位置,否则返回插入位置
二分法的典型应用
整体的判断条件是left<right-1,即停止while的时候left=right-1,可以判断left和right与target的关系
while循环内部 如果nums[mid]==target 直接返回
----难点是left<right-1这一步


1 0