ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

算法与数据结构第一周

2021-01-27 00:02:09  阅读:187  来源: 互联网

标签:digits return nums int 第一周 算法 vector 数据结构 nums1


Leetcode

66.加一

方法步骤:
数学上的加一,小时候我们列式子也是从后向前做加法的。(应该有专有名词但我忘了)
1.从后向前遍历,给当前成员加一
2.满足进位条件就置0该成员然后继续遍历,不满足则直接返回
3.当遍历结束 但没返回 表示 全进位置0的情况,则在成员前插入1即可。

class Solution  {
public:
    vector<int> plusOne(vector<int>& digits) {
        for(int i=digits.size()-1; i>=0; i--) //从后往前遍历
        {
            digits[i]++;//加一
            if(digits[i] == 10)  digits[i] = 0;//判断是否满足进位
            else  return digits;//不满足就直接返回
        }
        //如下条件举例表示 9999 + 1 = 10000
        digits.insert(digits.begin(), 1);
        //insert() 插入后将 0000 变成了 10000;
        return digits;
    }
};

在这里插入图片描述

1.两数之和

暴力解法:两层for循环查找,时间复杂度是O(n^2)

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

方法2:
题解来源
这个方法很明显比上面的优秀,但leetcode提交基本没差别

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        std::unordered_map <int,int> map;
        for(int i = 0; i < nums.size(); i++) {
            auto iter = map.find(target - nums[i]);
            if(iter != map.end()) {
                return {iter->second, i};
            }
            map.insert(pair<int, int>(nums[i], i));
        }
        return {};
    }
};

88.合并两个有序数组

注意考虑边界条件,如果p1 < 0,则直接将p2赋值给p,如果p2 < 0,则直接将p1赋值给p.
这个解法妙在根据 完整的已知条件 来处理问题
1.从后向前遍历,目的在于合并的同时排序(较大的数优先排在后面)
2.四种情况:①nums1为空 ②nums2为空 ③nums1成员 <= nums2成员 ④nums1成员 >= nums2成员
3.不要忘记每次情况成立后需要 自减

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        //从后向前遍历
        int p1 = m - 1 , p2 = n - 1 , p = m + n - 1;
        
        
        while(p >= 0){
            if(p1 < 0){	//如果nums1为空数组
                nums1[p] = nums2[p2--]; //nums2就为新
            }
            else if(p2 < 0){ //如果nums2为空数组
                nums1[p] = nums1[p1--]; //nums1就为新
         	} 
            else if(nums1[p1] <= nums2[p2]) { //一边排序一边合并
                nums1[p] = nums2[p2--]; //较大数在后
            }
            else{
                nums1[p] = nums1[p1--];
            }
            p--; 
        }
    }
};

26.删除排序数组中的重复项

做过移动零的会发现这道题的解法是比较类似的
快慢 双指针 来解决
快指针遍历 遇到和后一个不相同的数则去和慢指针成员交换
慢指针则是在满足条件后先自增再交换,返回值为当前下标+1,才是“长度”

注意一下快指针的结束条件,因为是第一个和第二个比较,所以需要提前一个结束。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if (nums.empty()) return 0; // 别忘记空数组的判断
        
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < (nums.size() - 1); fastIndex++){
            if(nums[fastIndex] != nums[fastIndex + 1]) { // 发现和后一个不相同
                nums[++slowIndex] = nums[fastIndex + 1]; 
                //slowIndex = 0 的数据一定是不重复的,所以直接 ++slowIndex
            }
        }
        return slowIndex + 1; //别忘了slowIndex是从0开始的,所以返回slowIndex + 1
    }
};

189.旋转数组

有点难啊 我再看看怎么写 我放弃了

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        vector<int> temp = nums;
        for (int i = 0; i < temp.size(); ++i)
            nums[(i + k) % temp.size()] = temp[i];
    }
};

标签:digits,return,nums,int,第一周,算法,vector,数据结构,nums1
来源: https://blog.csdn.net/GameStrategist/article/details/113199559

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有