Leetcode 2018算法面试题汇总【part1】

这个目录里的题目,计划是每两天用C++解一道题。这么多年,一直没把C++捡起来,今年有点改变吧。

只出现一次的数字

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        set<int> s;
        int res;
        for(auto i:nums){
            if(s.count(i)){
                s.erase(i);
            }else{
                s.insert(i);
            }
        }
        res = *s.begin();
        return res;
    }
};

多数元素

学习vector的用法

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        int target = nums[0];
        int count = 1;
        for(int i=0;i<nums.size();i++){
            if(nums[i]!=target){
                count--;
                if(count==0){
                    target = nums[i];
                    count = 1;
                }
            }else{
                count++;
            }
        }
        return target;
    }
};

搜索二维矩阵 II

从左下往右上遍历

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if(matrix.size() <= 0||matrix[0].size() <= 0){
            return false;
        }
        int m = matrix.size() ;
        int n = matrix[0].size();
        int i= m-1;
        int j = 0;
        
       while(i>=0 && j<=n-1){
           if(matrix[i][j]==target){
               return true;
           }else if(matrix[i][j]>target){
               i--; 
           }else{
               j++;
           }
       }
        return false;
    }
};

合并两个有序数组

从大的数开始比较

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int i=m-1;
        int j=n-1;
        int right = m+n-1;
        //第一种情况:当nums1先结束之后
        //第二种情况:当nums2先结束之后
        //第三种情况:当nums1和nums2都还没有结束时
    	
        //第3种情况,从后面开始比较,选择两者大的数
        while(i>=0 && j>=0){
            if(nums1[i]>nums2[j]){
                nums1[right] = nums1[i];
                i--;
            }else{
                nums1[right] = nums2[j];
                j--;
            }
            right--;
        }
        //第2种情况:nums2先结束,则无需再做处理,保持nums1前面未动的地方不变即可。
     
        //第1种情况,将nums2未Merge的队列放到nums1的前面
        while(j>=0){
            nums1[right] = nums2[j];
            j--;
            right--;
        }
    }
        
};

鸡蛋掉落

难:审题,注意题目中,鸡蛋个数的作用
参考:参考博文

class Solution {
public:
    int superEggDrop(int K, int N) {
        int remainTestCount = 1;
        while(getConfirmFloors(remainTestCount,K)<N){
            remainTestCount++;
        }
        return remainTestCount;
    }
    int getConfirmFloors(int remainTestCount,int remainEggs){
        if(remainTestCount==1 || remainEggs==1){
            //只能一层一层地从下往上扔,扔的次数取决于可测试次数,能扔多少次,可以确认多少层楼
            return remainTestCount;
        }
        return getConfirmFloors(remainTestCount-1,remainEggs-1)+1+getConfirmFloors(remainTestCount-1,remainEggs);
    }
};
发布了21 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Tracy_Yuan2014/article/details/103844660