zoukankan      html  css  js  c++  java
  • TopCoder SRM 625 Incrementing Sequence 题解

    本题就是给出一个数k和一个数组,包含N个元素,通过每次添加�数组中的一个数的操作,最后须要得到1 - N的一个序列,不用排序。

    能够从暴力法入手,然后优化。

    这里利用hash表进行优化,终于得到时间效率是O(n*n)的算法,并且常数项应该非常低,速度还挺快的。

    思路:

    1 假设数组A[i]在1 -N 范围内,就利用bool B[]记录,这个数已经找到了;

    2 假设A[i]的值之前已经找到了,那么就添加�k操作,得到新的值A[i]+k,看这个值是否找到了,假设没找到,就使用B记录,假设之前已经找到了,那么就继续反复添加�k的操作。

    3 假设最后A[i]+k大于N了,那么就能够返回IMPOSIBLE了,由于这样不可能得到要求的数列了。

    本算法的缺点是须要额外O(n)的bool空间,只是一般算法会通过sort之后处理也须要O(lgn)的int空间了,所以空间效率事实上也差点儿相同。

    而本算法的长处是:不须要排序,不须要做模运算,常数项应该低点,执行速度快。

    #include <vector>
    #include <string>
    using namespace std;
    
    class IncrementingSequence
    {
    public:
    	string canItBeDone(int k, vector<int> &A)
    	{
    		int N = (int)A.size();
    		vector<bool> B(N+1);
    		for (int i = 0; i < N; i++)
    		{
    			if (A[i] > N) return "IMPOSSIBLE";
    			while (A[i] <= 0 || B[A[i]])
    			{
    				A[i] += k;
    				if (A[i] > N) return "IMPOSSIBLE";
    			}
    			B[A[i]] = true;//不要错写成B[i]
    		}
    		for (int i = 1; i <= N; i++)	//别漏这个循环推断
    		{
    			if (!B[i]) return "IMPOSSIBLE";
    		}
    		return "POSSIBLE";
    	}
    };


    附一道250分的水题,须要找a*b +c = y,给出y找到a,b,c当中a, b, c 不能等于0, 或者1

    #include <vector>
    #include <math.h>
    using namespace std;
    
    class AddMultiply
    {
    public:
    	vector<int> makeExpression(int y)
    	{
    		vector<int> vx(3);
    		vx[0] = -1; vx[1] = 2;
    		vx[2] = y - vx[0] * vx[1];
    		return vx;
    	}
    };

    当然,假设还有额外的限制,那么本算法不是完好的,只是这里不错的思路是先找好难的部分,乘法部分,然后找加数就easy了。


  • 相关阅读:
    数据库基本概念
    Python语言特性之5:自省
    Python语言特性之4:类变量和实例变量
    Python语言特性之3:@staticmethod和@classmethod
    Python语言特性之2:元类
    Python语言特性之1:函数参数传递
    基础数学与算法学习
    推荐系统资料
    MySQL相关
    Python科学计算包模块的安装(ubuntu)
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3998227.html
Copyright © 2011-2022 走看看