第二天-力扣刷题

  之前不会排版,把word内容直接复制粘贴过来,没想到格式颜色都不对,空格也没用。这次刚看见的富文本编辑器。

  今天早晨复习了一下昨天的题,做的速度提高了,但是写完又报错,还找不出来为什么。感觉这样浪费时间比较多,打算调整下思路:

先直接全敲一遍,第二天复习的时候自己做,不熟练的、做错的,隔一段时间会回头重做。

例1

题号:448, 难度:简单

题目描述:

第二天-力扣刷题

解题思路:

数组两用,数组里存值,(下标+1)记录是否存在该数。

具体代码:

class Solution {
public:
    vector<int> findDisappearedNumbers(vector<int>& nums) {
        vector<int>ans;
        
        int n = nums.size();
        for(int i = 0; i < n; i++)  
        {
            //以值+1为索引,整个数组的索引代表数字是否存在,存在的为负数,不存在的是正数
            //特别要注意:nums[i]这个值有可能是负数,得取绝对值
            int index = abs(nums[i]) - 1;

            if(nums[index] > 0)
            {
               nums[index] = -nums[index] ;  
            }     
        }
        for(int i = 0; i < n; i++)
        {
            //找到所有为正数的索引
            if(nums[i] > 0)
            {
                ans.push_back(i + 1);
            }
        }

       return ans; 
    }
};

 运行结果:

第二天-力扣刷题

总结:

 要注意两点:

  1. 遍历到后面有重复数的时候,读出来的值可能是负数,如果直接拿去当下标会出现问题,要取绝对值
  2. nums[index]改成nums[ abs(nums[i])  - ]的话,运行时间会增加好多。第一遍写完代码后,可以提炼一下,看看有哪些重复的地方,可以新定义一个变量然后赋值。用变量表示的话就调用函数快一些。

上一篇:vue基础二


下一篇:Elasticsearch(4)--- 基本概念(Index、Type、Document、集群、节点、分片及副本、倒排索引)