1.TwoSum

记录被LeetCode虐的日子
第一种方法:使用枚举

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target)
{
    int *result = (int*)malloc(2 * sizeof (int));  //申请内存
    int i = 0;
    int j = 0;
    if(sizeof(nums) < 1)  //输入参数有误判断
    {
        return NULL;
    }
    for(i = 0;i <= numsSize-1; i++)
    {
        for(j = 0;j <= numsSize-1;j++)
        {
            if((nums[i] + nums[j] == target) && (j != i) )
            {
                result[0] = i;
                result[1] = j;
                break;
            }
        }
    }
    return result;
}

注意:
1 代码开始,先检查边界值。如果为边界值,直接返回相应结果;如果是指针则检查是否为NULL.是数字的情况,要考虑特殊的数值,如零
2 提示错误:

load of null pointer of type 'const int'

在调用函数返回时,返回值如果是一个常量,则没问题。
返回值若为指针,则需注意会出现这个错误。如果返回的指针地址指向函数内的局部变量,在函数退出时,该变量的存储空间会被销毁,此时去访问该地址就会出现这个错误。
解决办法有以下三种:
1)返回的指针使用malloc分配空间
2)将该变量使用static修饰 static修饰的内部变量作用域不变 但是声明周期延长到程序结束 即该变量在函数退出后仍然存在
3)使用全局变量
建议使用malloc分配空间返回
3 指针数组初始化方法
指针数组中的每个元素都是一个指针,如下的array数组中的每个元素都是一个字符串指针,指向一个一维字符串数组。

char **array;
array = (char **)malloc(sizeof(char *) * 100) ; //array包含100个指针元素 为这100个指针变量分配空间
for(int i = 0; i < 100; i++)
array[i] = (char *)malloc(sizeof(char) * 50); // 为array中的每个指针变量进行初始化 上面的表达式只是为指针变量分配了空间 并没有为它们赋值 此语句为每个指针分配了长度为50个字符的空间 并将该空间的初始地址赋值给array中的指针

以下为第二次做这道题

  • 解法一

    解法一就是把数组中所有的值算出来,找到等于target的值,然后返回相应的位置即可。时间复杂度为O(N^2)

  /**
   * Note: The returned array must be malloced, assume caller calls free().
   */
  int* twoSum(int* nums, int numsSize, int target)
  {
      int *result = (int*)malloc(2 * sizeof (int));  //申请内存
      int i = 0;
      int j = 0;
      if(sizeof(nums) < 1)  //输入参数有误判断
      {
          return NULL;
      }
      for(i = 0;i <= numsSize-1; i++)
      {
          for(j = 0;j <= numsSize-1;j++)
          {
              if((nums[i] + nums[j] == target) && (j != i) )
              {
                  result[0] = i;
                  result[1] = j;
                  break;
              }
          }
      }
      return result;
  }
  • 解法二 使用Hash Map

    Hash Map来建立数字和坐标之间的映射关系,

    class Solution
    {
    public:
    	vector<int> twoSum(vector<int>& nums, int target)
    	{
    		unordered_map<int, int> datamap;  //哈希表 用来建立数字和坐标之间的映射关系
    		vector<int> res;
    		for (int i = 0; i < nums.size(); i++)
    		{
    			datamap[nums[i]] = i;
    		}
    
    		for (int i = 0; i < nums.size(); i++)
    		{
    			int t = target - nums[i];  //t 就是希望在哈希表中找到的元素
    			if (datamap.count(t) > 0)
    			{
    				//说明在哈希表中找到了t
    				res.push_back(i);
    				res.push_back(datamap[t]);
    				break;
    			}
    
    		}
    
    		return res;
    	}
    };

上面代码存在一个BUG,当提交到leetcode时,testcase为{3,2,4},target = 6时可以测出这个BUG。修改后的代码为

    class Solution
    {
    public:
    	vector<int> twoSum(vector<int>& nums, int target)
    	{
    		unordered_map<int, int> datamap;  //哈希表 用来建立数字和坐标之间的映射关系
    		vector<int> res;
    		for (int i = 0; i < nums.size(); i++)
    		{
    			datamap[nums[i]] = i;
    		}
    
    		for (int i = 0; i < nums.size(); i++)
    		{
    			int t = target - nums[i];  //t 就是希望在哈希表中找到的元素
    			if (datamap.count(t) > 0 && datamap[t] != i)
    			{
    				//说明在哈希表中找到了t
    				res.push_back(i);
    				res.push_back(datamap[t]);
    				break;
    			}
    
    		}
    
    		return res;
    	}
    };
posted @ 2019-01-12 20:45  尚修能的技术博客  阅读(174)  评论(0编辑  收藏  举报