摘要: 题目要求不能用除法,只能老老实实乘。 记 left[i] 为从左乘到 a[i-1],right[i] 为从右乘到 a[i+1],则 res[i] = left[i]*right[i] 。 由于 left[i] 和 right[i] 都只依赖前一个状态,因此可以用一个变量来代替数组。 这道题给人一种强 阅读全文
posted @ 2018-06-06 13:48 約束の空 阅读(115) 评论(0) 推荐(0)
摘要: 求到所有点距离和最小的点。由于是麦哈顿距离,横坐标和纵坐标计算是独立的,于是问题转化为找一维数轴上到所有点距离和最小的点。 这个问题是老生常谈的问题了,如果是点的个数是奇数,答案就是中位数;如果是偶数,则最内侧两个点中间所有的数都可以是答案。两种情况都可以用 nums[nums.size()/2] 阅读全文
posted @ 2018-06-06 13:32 約束の空 阅读(114) 评论(0) 推荐(0)
摘要: 每次一定是选择最小的n-1个数+1。直接做会超时。 换一种思路,对最小的n-1个数+1,等价于对最大的数-1,问题就很简单了。 阅读全文
posted @ 2018-06-06 11:36 約束の空 阅读(92) 评论(0) 推荐(0)
摘要: 题目要求不能对原链表进行操作,因此直接把链表都逆过来是不行的(该问题的I问题就是逆过来的)。 但是不逆过来不好做,因此计算的时候逆过来,或者逆过来再计算。 方法一: 计算的时候逆过来:新建一个链表,在计算对应位和的时候逆过来。 方法二: 逆过来再计算:不能对原链表操作,那我们可以建立一个数组,倒序访 阅读全文
posted @ 2018-06-05 22:56 約束の空 阅读(111) 评论(0) 推荐(0)
摘要: 用hash表记录每个字符的个数,开始我是新建了一个vector<pair<int,char>>然后依据个数排序。 后来发现可以直接对string排序。 其中运用了lambda表达式,利用引用捕获得到count。 关于Lambda,详见: http://en.cppreference.com/w/cp 阅读全文
posted @ 2018-06-03 15:21 約束の空 阅读(114) 评论(0) 推荐(0)
摘要: 玩过极限脱出999,对数字根印象深刻。 随便一个数,假设abcd, abcd=a*1000+b*100+c*10+d =a*(1+999)+b*(1+99)+c*(1+9)+d =(a+b+c+d)+a*999+b*99+c*9 =(a+b+c+d)+9*(a*111+b*11+c) 所以abcd% 阅读全文
posted @ 2018-06-03 11:47 約束の空 阅读(103) 评论(0) 推荐(0)
摘要: 136. Single Number 考察的是异或运算。相同的数异或结果为0,一个数与0异或还是原来的数,以及异或符合交换律。因此,把所有的数都异或起来,结果就是落单的那个数。 268. Missing Number 可以用数学方法直接做,求和减去数组的和就是所求答案。 用位操作来做的话,同样用异或 阅读全文
posted @ 2018-06-03 00:26 約束の空 阅读(102) 评论(0) 推荐(0)
摘要: 题目核心是矩阵遍历。以前做过类似的题,不过是正方形的情况。我都是由外向内,层一个for循环,四个方向一个for循环,坐标计算相对复杂。 换一种思路,记矩阵左上角坐标(i1,j1),右下角(i2,j2)。一个大的while循环,按照四个方向遍历,缩小矩阵。其实思路和之前一样,只不过规避掉了坐标繁琐的计 阅读全文
posted @ 2018-06-02 23:34 約束の空 阅读(109) 评论(0) 推荐(0)
摘要: 判断链表有没有环,用Floyd Cycle Detection算法,用两个快慢指针。 142是141的进阶,需要额外判断环的起点。 详见 https://leetcode.com/problems/linked-list-cycle-ii/solution/ 中的推导,不过里面应该是 F=(n-1) 阅读全文
posted @ 2018-06-02 18:45 約束の空 阅读(95) 评论(0) 推荐(0)
摘要: 判断是否有循环的问题。 解法一:可以用hash表将出现过的值保存起来,再次出现即说明有循环。 解法二:应用Floyd Cycle Detection算法,设一个快变量一个慢变量。如果循环存在,它们一定会相遇。 阅读全文
posted @ 2018-06-02 16:28 約束の空 阅读(95) 评论(0) 推荐(0)