LeetCode-简单

21 阅读3分钟

136-只出现一次的数字

给定一个非空整形数组,除了讴歌元素只出现一次以外,其余每个元素均出现两次。找出那个只出现一次的元素。

示例:输入[2,2,1],输出:1

class solution
{
    public:
        int getSingleNamu(std::vector<int> &nums)
        {
            int res = 0;
            for(int i:i<nums.size();i++) {
                res ^ = nums[i];
            }
            return res;
        }
};

70-爬楼梯

假设你正在爬楼梯,需要n阶你才能到达楼顶。每次你可以爬1或2个台阶,你有多种不同的方法爬到楼顶呢?

关键思想:要到达第n阶,最后一步只能是以下两种方式之一:

  • 从第n-1阶爬1阶上来
  • 从第n-2阶爬2阶上来

假设爬4: 第4阶的所有方法 = (所有到达第3阶的方法,然后爬1阶) + (所有到达第2阶的方法,然后爬2阶)

因为爬楼梯的选择具有无后效性:无论前面怎么爬,最后一步的选择只取决于当前所在的位置,与之前的具体路径无关。

换句话说:

  • 所有到达n阶的方法 = 所有"以爬1阶结束"的方法 + 所有"以爬2阶结束"的方法
  • "以爬1阶结束"的方法数 = 到达n-1阶的方法数
  • "以爬2阶结束"的方法数 = 到达n-2阶的方法数
class solution {
    int climbStaires(int n) {
        if(n == 1)
            return 1;
        if(n == 2)
            return 2;
        int res = climbStaires(n - 1) + climbStaires(n-2);
        return res;
    }
};

//优化后:

class solution {
    std::underedmap<int,int> resMap;
    int climbStaires(int n) {
        if(n==1)
            return 1;
        if(n==2)
            return 2;
        
        /*
        错误
        auto it = resMap.find(n-1);
        int res1 = 0;
        int res2 = 0;
        if( it != resMap.end()) {
            res1 = it->second;
        }else {
            resMap[n] = climbStaires(n-1);
        }
        it = resMap.find(n-2);
        if( it != resMap.end()) {
            res1 = it->second;
        }else {
            resMap[n] = climbStaires(n-2);
        }        
        return res1 + res2;
        */
        
        auto it = resMap.find(n);
        if( it != resMap.end()) {
            return it->second;
        }else {
            int res = climbStaires(n-1) + climbStaires(n-2);
            resMap[n] = res;
            return res;
        }
    }
};


1-两数之和

给定一个整形数组和一个整数目标值target,请你在该数组中找出和目标值taraget那两个整数,并返回它们的数组下标。你可以假设每一组输入只会对应一个答案。

输入:nums=[2,7,11,15],target = 9;输出[0,1]

class solution {
    vector<int> getSum(vector<int> &nums,int target) {
        vector<int> vec;
        undered_map<int,int> map;
        for(int i = 0;i<nums.size();i++) {
            auto it = map.find(target - nums[i]);
            if(it == map.end()){
               map[target-nums[i]) = i;
               continue;
            }else{
                vec.push(i);
                vec.push(map[target - nums[i]);
                break;
            }
        }
        return vec;
    }
};

合并两个有序数组

若给你两个非递减顺序排列的整数数组num1和num2,另有两个整数m和n,分别表示num1和num2中的元素。请你合并num2和num1中,合并后的数组仍非递减顺序排列。合并后存储在数组num1中,num1的初始长度为m+n

输入:num1=[1,2,3,0,0,0],num2=[2,5,6],m=3,n=3

输出:[1,2,2,3,5,6]

class solution
{
    public:
        void merge(vector<int>& num1,m,vector<int>& num2,n)
        {
            int i = m - 1;//num1有效元素的最后一个位置
            int j = n - 1;//num2最后一个位置
            int k = m+n-1;//num1最后一个位置
            while(i >= 0 && j >=0) {
                if(num1[i]>num2[j--]){
                    num1[k--]=num1[j]
                }else{
                    num1[k--]=num2[i--];
                }
            }
            //[3,4,7,0,0], [1,2]
            while(j>=0)//如果nums2还有剩余元素,直接复制到nums1前面
            {
                num1[k--]=num2[j--];
            }
            // 如果nums1还有剩余元素,它们已经在正确的位置,无需处理
        }
};

移动0

给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。

输入:[0,1,0,3,12],输出:[1,3,12,0,0,0]

void sortZero(std::vector<int> &nums) {
    int left = 0;
    for(int i = 0;i<nums.size();i++) {
        if(nums[i] != 0) {//将所有非零元素移动到前面
            nums[left++] = nums[i];
        }
    }
    for(int i = left;i < nums.size();i++) {
        nums[i] = 0;//剩余位置为0
    }
}

448-找到所有数组中消失的数字

给你一个含n个整数的数组nums,其中nums[i]在区间{1,n}内,请你找出所有在[1,n]范围内但没有出现在nums中的数字,并以数组的形式返回结果。

输入:[4,3,2,7,1],输出:[5,6]