每日一练(算法)
她说巷尾的樱花开了
这个作者很懒,什么都没留下…
展开
-
每日一练-----顺时针打印矩阵
思想: 我们可以将矩阵分成一圈一圈的进行打印,而确定这个圈的大小可以通过左上角坐标和右下角坐标来实现,打印完一圈之后令左上角横纵坐标均加1,右下角横纵坐标均减1,如果当左上角横坐标等于右下角横坐标的话,那么根本不用四个循环来输出一圈了,直接输出这行就可以了,如果左上角纵坐标和右下角纵坐标相等的话,同样也不需要利用四个for循环打印一圈,只需要打印这一列就可以了,除此之外就需要四个for循环来打印原创 2016-05-01 22:11:45 · 1570 阅读 · 0 评论 -
每日一练-----顺时针旋转矩阵
思想: 同样也是把整个矩阵看成是一圈一圈的进行打印就可以了,打印完一圈之后令左上角坐标向右下角移动,右下角坐标向左上角移动,直到右下角坐标小于左上角坐标为止; 具体的转换策略见图: 实际的操作中,注意将其中的len以及0等进行适当的替换,因为这个只是模拟了遍历最外圈的情形,如果遍历里面圈的话,开始一定不是0啦,而是里圈的最左上角坐标: 代码: import java.util.S原创 2016-05-02 22:51:40 · 1567 阅读 · 0 评论 -
每日一练-----局部最小值位置
题目: 定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0] 思想: 采用类似于二分查找算法,时间复杂度可以达到O(lgn) (1)首先判断第一个元素和第二个元素的大小,如果第一个元素小于第二个元素的话,那么直接输出第一个元素的位置即可; (2)如果(1)不成立的话,比较最后一个元素和次最后一个元素的大小,如果最后一个元素小于次最后原创 2016-05-03 22:15:59 · 3046 阅读 · 0 评论 -
每日一练-----最大连续子数组的和
问题: 给定一个整数数组,数组种可能存在正数、负数和零。求所有子数组的和的最大值; 例如: 如果输入的数组是{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2}, 那么输出该子数组的和为18 思想: 解决方法类似于上面的求子数组最大积,只是当前位置处子数组的最大和可能是前面的max+当前位置值与当前位置值得最大值; 代码: public class原创 2016-05-05 13:42:24 · 1488 阅读 · 2 评论 -
每日一练-----返回乘积最大的子数组的积
问题: 给定一个double类型的数组arr,其中元素可正可负,返回子数组累乘的最大乘积; 如: arr = [-2.5,4,0,3,0.5,8,-1] 则子数组[3,0.5,8]累乘获得最大乘积,返回12; 思想: 采用一个临时变量来存储遍历到当前位置的情况下所能够得到的最大乘积,这个值无非有三种可能性: (1)情况,例如2,3,5达到5的情况,因为之前的最大乘积值是2*3=6,原创 2016-05-05 10:42:52 · 2056 阅读 · 2 评论 -
每日一练-----求最长回文子串
思想:Manacher算法 该算法避免了我们在遍历过程中对回文字符串是奇数长度还是偶数长度分别都要进行判断的操作,做法就是在开始结束以及每个字符之间添加特殊字符,以1221为例,进行填充之后就变成#1#2#2#1#,以121为例,进行填充之后就变成#1#2#1#,这样做的好处是,填充之后字符串的长度都成了奇数,这样我们在遍历的过程中对于每一个位置的判断都转换成了同样的操作,并不需原创 2016-05-23 22:30:27 · 1523 阅读 · 0 评论