LeetCode算法编程之连载四(二分法)

1、题目 – Sqrt(x)

Implement int sqrt(int x).

Compute and return the square root of x.

题目意思很简单,就是求出x的平方根。

分析:

一看这题目,感觉很简单,很容易想到的是二分法,我最开始的解法是从1、2、4、8 … 2 * n,计算出n < x < 2n,然后再在 n 和 2n间,用二分法,找到平方根结果。

这种方法比较麻烦的一点是,乘积是有可能越界的,要处理乘积越界的情况,代码可读性不强。

class Solution {
public:
    int sqrt(int x) {
        int base = 1;
        int product = base * base;

        while (product < 0
               || (product > 0 && product < x))
        {
            base *= 2;
            product = base * base;
        }

        if (product == x)
        {
            return base;
        }

        int start = base / 2;
        int end = base;

        int med = start + (end - start) / 2;

        while (start != med)
        {
            int product = med * med;
            if ((product >= 0 && product > x) || product < 0)
            {
                end = med;
            }
            else
            {
                start = med;
            }

            med = start + (end - start) / 2;
        }

        return med;
    }
};

要解决乘积越界的情况,有没有什么好的办法呢?能不能思考一下,在32位可表达的情况下,平方根可能出现的最大的情况?想到位图是不是可以来表示呢?利用二分法,

(1 << 16)的平方为1 << 32位(这已越界),那么最大值是1 << 15,既然知道可表示的最大位数是15,那么依次往低走,根据乘积与x的比较看看每一位可否置1,根据这个思路,有了位图的解决方法:

class Solution {
public:
    int sqrt(int x) {

        unsigned int res = 0;
        int bit = 1 << 15;

        while (bit > 0)
        {
            res |= bit;
            if (res * res > x)
            {
                res ^= bit;
            }

            bit >>= 1;
        }

        return res;
    }
};

这个代码是不是很漂亮了

2、题目 - Search a 2D Matrix

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

    Integers in each row are sorted from left to right.
    The first integer of each row is greater than the last integer of the previous row.

For example,

Consider the following matrix:

[
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]

题目解释:

输入为一个m x n的矩阵,矩阵每行已从小到大排序,每行第一个数大上一行的最后一个数,在矩阵中是否能找到数x。

分析:

很容易想到,先到这个数所在行,然后在找到这个数所在的列。当然依次遍历过去的是可以的,反正是已经排过序的,这是最笨的方法。但作为搞算法的,最基本的方法就是二分法,

思路是一样的,利用行二分法,找到所在行,再利用列二分法,找到所在的列。

class Solution {
public:
    bool searchMatrix(vector<vector<int> > &matrix, int target) {

        int row = matrix.size();
        if (row == 0)
        {
            return false;
        }

        int col = matrix[0].size();

        int start = 0;
        int end = row - 1;
        int med = start + (end - start) / 2;

        // 二分法找行
         while (med != start)
        {
            if (matrix[med][0] == target)
            {
                return true;
            }

            if (matrix[med][0] > target)
            {
                end = med;
            }
            else
            {
                start = med;
            }

            med = start + (end - start) / 2;
        }

        int exact_row = end;
        if (matrix[end][0] > target)
        {
            exact_row = start;
        }

        start = 0;
        end = col - 1;
        med = start + (end - start) / 2;

        // 二分法找列
         while (start != med)
        {
            if (matrix[exact_row][med] == target)
            {
                return true;
            }

            if (matrix[exact_row][med] > target)
            {
                end = med;
            }
            else
            {
                start = med;
            }

            med = start + (end - start) / 2;
        }

        if (matrix[exact_row][start] == target
            || matrix[exact_row][end] == target)
        {
            return true;
        }

        return false;
    }
};
时间: 2024-11-13 08:56:55

LeetCode算法编程之连载四(二分法)的相关文章

LeetCode算法编程之连载三

1.题目 - Linked List Cycle II Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Follow up: Can you solve it without using extra space? 题目解释: 单链表找环的题目,代码中不开辟新的空间,这道题应该是算法面试和一些书籍上常见的题. 这道题,在读书的时候就做过了,不过很久没有搞类

ActionScript3游戏中的图像编程(连载四十六)

总目录:http://blog.csdn.net/iloveas2014/article/details/38304477 3.1.2 以小见大--从细节损失洞悉滤镜本质 把它再改回内斜角,边缘似乎光滑了些,但这种错觉仅仅是由于阴影与蓝色的对比度不够强烈,才会让边缘的粗糙不够显眼.把文字颜色调成浅紫以后,转角处的锯齿依旧一览无余.(图 3.6),而Photoshop应用同样的设置则不会出现同样的问题(图 3.7). 图 3.6 模糊值为3的内侧斜角滤镜 图 3.7 大小等于3的斜面样式 如果认为

ActionScript3游戏中的图像编程(连载四十七)

总目录:http://blog.csdn.net/iloveas2014/article/details/38304477 3.1.3 用内侧滤镜验证Flash简单滤镜的实现原理 以上测试都在外侧进行,为了证实内侧滤镜的实现机制与外侧并无大异,我再次用一个方块让内阴影滤镜在方块上移动.(图 3.23) 图 3.23 内阴影滤镜的效果 阴影层似乎并非从复制出来的轮廓,因为方块的边缘并不存在这种内转角的结构.但是,当我把距离调回到0的时候,真相终于浮出水面.(图 3.24) 图 3.24 距离为0的

LeetCode算法编程(两题)

今天看到酷壳推荐的国外编程LeetCode算法编程网站,上面目前有154道算法题,感觉很有意思,平常工作也比较忙,现在很少有时间来锻炼算法相关的东西,有空的时候静下心来,温习下基础,活跃下自已的思路,也是有必要的.先做了几道,后面会陆续补充其它的题目. 1.题目-PlusOne Given a non-negative number represented as an array of digits, plus one to the number. The digits are stored s

ActionScript3游戏中的图像编程(连载四十八)

总目录:http://blog.csdn.net/iloveas2014/article/details/38304477 3.1.4 简单滤镜中的渐变原理探讨 我们再简单的看一下滤镜里的渐变条. 为了尽可能地减少复杂的文字轮廓所造成的干扰,我再次使用方块进行试验. 我画了一个紫色的方块(啥颜色其实都无所谓了),然后添加渐变发光滤镜,把模糊和距离值都调大,以便看清楚渐变的轮廓,然后给渐变条随意地加上几种颜色(图 3.30) 图 3.30 模糊范围较大的渐变发光 可以看到,渐变条上的色彩从右往左地

ActionScript3游戏中的图像编程(连载四十)

2.3.2 Photoshop斜面样式的精雕细琢VS Flash斜面滤镜的粗制滥造 下面我们先把没对应上的参数一一列出来. Photoshop:样式,方法,深度&方向,软化,阴影高度,(等高线) Flash:强度,距离,类型,(挖空) 做到这一步,我就纳闷了,为什么Flash斜角滤镜的参数又是这些,跟投影好像没啥两样. 括号部分的参数我暂时先排除掉,等高线我们没有编辑过,它默认也用线性图,暂时认为它没有影响,而挖空几乎与滤镜效果无关,也能排除. Photoshop的样式显示为内斜面,以下拉框的形

ActionScript3游戏中的图像编程(连载四十一)

2.3.3 Photoshop深度==Flash强度? 下一个是深度,用排除法我对应上了强度.这次跟投影的不一样,深度可以小于100%.但不管如何,我们先把深度调很大看看,比如都调到1000%.(图 2.62,图 2.63) 图 2.62 强度1000%的Flash斜角滤镜 图 2.63 深度1000%的Photoshop斜面 Photoshop里,浮雕的高度明显增大,而且轮廓相当美观.Flash虽然也明显地凸了起来,但已经彻底失控了,又是数值过大所致? 数值调小点吧,150%?200%?效果始

ActionScript3游戏中的图像编程(连载四十二)

2.3.4 Photoshop高度==Flash距离? 剩下高度一项了,跟距离相对应吗? 但是,高度以角度为单位,但距离却是像素,似乎拉不上关系.不过我们照样做下试验:先试一下Photoshop的高度.在调整的过程里发现,浮雕的厚度并没随着高度的增加而变大.只感觉到光影往某个方向微妙地移动着. 图 2.69~图 2.75展示了不同高度下的效果. 图 2.69 高度=0° 图 2.70 高度=15° 图 2.71 高度=30° 图 2.72 高度=45° 图 2.73 高度=60° 图 2.74

ActionScript3游戏中的图像编程(连载四十四,第3章开始)

3.1 Flash简单滤镜真相大揭秘 上一章,我们用Flash的滤镜仅仅模拟了Photoshop里面的两个简单样式(当然只是我们的参数设置得比较简单,Photoshop样式远比我们想象中的复杂),就已经困难重重,一波三折了,而且效果还不如Photoshop的细致.那么,到底是什么原因导致Flash的简单滤镜如此受限?Flash简单滤镜是如何实现的? 进入本节之前,先明确下简单滤镜的概念,在ActionScript中,滤镜可以分为两大类,简单滤镜和复杂滤镜,前者指可以通过Flash IDE直接设置