Leetcode刷题笔记(C++)——数组
整理一下刷题过程中的思路,在这里进行一下总结与分享。
github地址:https://github.com/lvjian0706/Leetcode-solutions
github项目是刚刚新建的,陆续会将整理的代码以及思路上传上去,代码是基于C++与python的。同时会将基础的排序算法等也一并进行整理上传。
66. 加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
class Solution {
public:
/*
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
1. 将该数组反转,编程从低位到高位的顺序;
2. 进行加1运算,其中,定义flag变量用于记录是否进位,其中运算到最后如果flag等于1,说明答案数组比原始数组多1位,需要push_back(1);
3. 将结果数组反转;
*/
vector<int> plusOne(vector<int>& digits) {
reverse(digits.begin(), digits.end());
int flag = 1;
for(int i=0; i<digits.size(); i++){
if((digits[i] + flag) >= 10){
digits[i] = (digits[i] + flag) % 10;
}
else{
digits[i] = digits[i] + flag;
flag = 0;
}
}
if(flag==1) digits.push_back(1);
reverse(digits.begin(), digits.end());
return digits;
}
};
350. 两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
class Solution {
public:
/*
计算两个数组的交集:
方法1. 先排序,后使用双指针遍历
1. 将两个数组排序,从小到大即可;
2. 定义两个指针用于遍历两个数组;
3. 当两个元素相等时,存入答案中,nums1[i]<nums2[j]时,i++,找比nums1[i]大的元素继续判断,当nums1[i]>nums2[j]时,j++,找比nums2[j]大的元素继续判断;
*/
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
vector<int> ans;
int i=0, j=0;
while(i<nums1.size() && j<nums2.size()){
if(nums1[i]==nums2[j]){
ans.push_back(nums1[i]);
i++;
j++;
}
else if(nums1[i]<nums2[j]) i++;
else if(nums1[i]>nums2[j]) j++;
}
return ans;
}
};
class Solution {
public:
/*
计算两个数组的交集:
方法2. 使用哈希表存放nums1中的元素以及出现次数,然后遍历nums2并将重复元素放入答案中,遍历过程中,碰到重复元素需要将哈希表中的出现次数减1;
*/
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
map<int, int> nums1_map;
vector<int> ans;
for(int i=0; i<nums1.size(); i++){
if(nums1_map.find(nums1[i]) == nums1_map.end()){
nums1_map[nums1[i]] = 1;
}
else nums1_map[nums1[i]]++;
}
for(int j=0; j<nums2.size(); j++){
if(nums1_map.find(nums2[j]) != nums1_map.end() && nums1_map[nums2[j]] > 0){
ans.push_back(nums2[j]);
nums1_map[nums2[j]]--;
}
}
return ans;
}
};