• 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;
        	}
        };
    
  • 相关阅读:
    linux基础指令(下)
    Linux基础命令(中)
    wtforms校验组件
    Linux基础命令(上)
    Scrapy
    SQLAlchemy
    自定义命令
    flask-session
    解决Failed to allocate memory: 8转
    如何做需求
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/10260962.html
Copyright © 2020-2023  润新知