欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > C++ For Hot100

C++ For Hot100

2024/11/30 8:58:03 来源:https://blog.csdn.net/weixin_45302337/article/details/143994958  浏览:    关键词:C++ For Hot100

数组:数组是存放在连续内存空间上的相同类型数据的集合。

1. 两数之和 - 力扣(LeetCode)

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

1512. 好数对的数目 - 力扣(LeetCode)

class Solution {
public:int numIdenticalPairs(vector<int>& nums) {int j, ans = 0;int hash[101];memset(hash,0,sizeof(hash));for(j=0;j<nums.size();++j){ans += hash[nums[j]];++hash[nums[j]];}return ans;}
};

注意:这里的ans是累加的形式,也就是当前时刻的nums[j]会去和之前的配对找到相应的组数,并且加上之前的组数,因此才是ans = ans + hash[nums[j]];

709. 转换成小写字母 - 力扣(LeetCode)

tolower()

这里需要注意的是用引用,因为需要修改字符串s里面元素的值;

class Solution {
public:string toLowerCase(string s) {for(char& ch:s) ch = tolower(ch);return s;}};

258. 各位相加 - 力扣(LeetCode)

这道题指的注意的就是:int temp = num%10; sum+=num;num/=10;就可以得到num的各个位相加的数;

class Solution {
public:int addDigits(int num) {int sum;while(num>=10){sum=0;while(num){int temp=num%10;sum+=temp;num/=10;}num = sum;}return num;}
};

1281. 整数的各位积和之差 - 力扣(LeetCode)

class Solution {
public:int subtractProductAndSum(int n) {int sum = 0;int pro = 1;int ans;int arr[] ={0};while(n>0){int temp = n%10;sum += temp;pro *= temp;n /= 10;}ans = pro - sum;return ans;}
};

231. 2 的幂 - 力扣(LeetCode)

这道题有了二进制的按位与,因为如果是2的幂,减一之后两个数的按位与就是0;

class Solution {
public:bool isPowerOfTwo(int n) {return n>0 && (n&(n-1)) == 0;}
};

 867. 转置矩阵 - 力扣(LeetCode)

矩阵转置,最好创建新的vector<int,vector<int>> result(col,vector<int> (row) 二维容器就是

vector<int,vector<int>> result(col//行数,vector<int> (row) //列数);

class Solution {
public:vector<vector<int>> transpose(vector<vector<int>>& matrix) {int row = matrix.size();int col = matrix[0].size();vector<vector<int>> result(col, vector<int>(row));for(int i=0;i<row;i++){for(int j = 0;j<col;j++){result[j][i] = matrix[i][j]; // 转置操作}}return result;}
};

也就是说如果是创建二维的容器,vector<vector<int>> result(col, vector<int>(row)); 这里面的result的两个参数分别是

704. 二分查找 - 力扣(LeetCode)

class Solution {
public:int search(vector<int>& nums, int target) {int mid;int left = 0;int right = nums.size()-1;while(left <= right){mid = (left + right) / 2;if(target<nums[mid]){right = mid-1;}else if(target>nums[mid]){left = mid+1;}else{return mid;}}return -1;}
};

27. 移除元素 - 力扣(LeetCode)

class Solution {
public:int removeElement(vector<int>& nums, int val) {int slowindex = 0;if(nums.size()==0) return 0;for(int i=0;i<nums.size();i++){if(nums[i]!=val){nums[slowindex] = nums[i];slowindex++;}}return slowindex;}
};

977. 有序数组的平方 - 力扣(LeetCode)

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {for(int i =0;i<nums.size();i++){nums[i] = nums[i]*nums[i];}std::sort(nums.begin(), nums.end());return nums;}
};

第一种方法就是利用了迭代器,sort(nums.begin(),nums.end());

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {vector<int> ans(nums.size());;int k=nums.size()-1;int left = 0;int right = nums.size()-1;while(left <= right){if(nums[left]*nums[left]<=nums[right]*nums[right]) {ans[k] = (nums[right] * nums[right]);right-=1;}else {ans[k] = nums[left] * nums[left];left+=1;}k--;}return ans;}
};

双指针法,就是right和left两个指针从begin和end开始找

209. 长度最小的子数组 - 力扣(LeetCode)

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int slowindex = 0;int min_len = INT_MAX;int sum = 0;for(int fast=0;fast<nums.size();fast++){sum += nums[fast];while(sum>=target){min_len = std::min(min_len, fast - slowindex + 1);sum -= nums[slowindex];slowindex+=1;}}return (min_len == INT_MAX) ? 0 : min_len;}
};

59. 螺旋矩阵 II - 力扣(LeetCode)

class Solution
{
public:vector<vector<int>> generateMatrix(int n){vector<vector<int>> mat(n, vector<int>(n)); int l=0, r=n-1, t=0, b=n-1;int num=1, tar=n*n;while(num<=tar){for(int i=l;i<=r;i++) mat[t][i] = num++;t++;for(int i=t;i<=b;i++) mat[i][r] = num++;r--;for(int i=r;i>=l;i--) mat[b][i] = num++;b--;for(int i=b;i>=t;i--) mat[i][l] = num++;l++; }return mat;}
};

58. 区间和(第九期模拟笔试)

#include<iostream>
#include<vector>using namespace std;int main(){int n,a,b;cin >> n;vector<int> vec(n);vector<int> p(n);int presum = 0;for(int i=0;i<n;i++){cin >> vec[i];presum += vec[i];p[i] = presum;}while(cin >> a >> b){int sum;if(a==0) sum = p[b];else sum = p[b]-p[a-1];cout<<sum<<endl;}
}

区间和,利用前缀和操作,也就是对于p这个vector容器,里面的每一个元素都是该index之前的元素的累加和;

283. 移动零 - 力扣(LeetCode)

class Solution {
public:void moveZeroes(vector<int>& nums) {int slowindex = 0;for(int fast = 0;fast<nums.size();fast++){if(nums[fast]!=0){nums[slowindex] = nums[fast];slowindex++;}}for(int i=slowindex;i<nums.size();i++){nums[i] = 0;}return;}
};

11. 盛最多水的容器 - 力扣(LeetCode)

class Solution {
public:int maxArea(vector<int>& height){int left =0, right = height.size()-1;int hei = 0, temp = 0;int area = INT32_MIN;while(left<=right){if(height[left]<height[right]){hei = height[left]; temp = (right-left) * hei;left += 1;}else{hei = height[right];temp = (right-left) * hei;right -= 1;}area = area > temp? area : temp;}return area;}
};

15. 三数之和 - 力扣(LeetCode)

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ans;int slow = 0, fast = nums.size()-1;std::sort(nums.begin(), nums.end());for(int i=0;i<nums.size();i++){if (nums[i] > 0) {return ans;}if (i > 0 && nums[i] == nums[i - 1]) {continue;}slow = i+1;fast = nums.size()-1;while(slow<fast){if((nums[i]+nums[fast]+nums[slow])<0) slow+=1;else if((nums[i]+nums[fast]+nums[slow])>0) fast-=1;else{ans.push_back({nums[i],nums[slow],nums[fast]});while (fast > slow && nums[fast] == nums[fast - 1]) fast--;while (fast > slow && nums[slow] == nums[slow + 1]) slow++;// 找到答案时,双指针同时收缩fast--;slow++;}}}return ans;}
};

三数之和,首先就用sort(nums.begin(),nums,end())进行排序;然后剪枝,如果nums[i]一开始就大于0那不可能存在三元组,直接return;如果nums[i]==nums[i-1]说明之前已经有过相同的元素了,这次就跳过;后面才开始真正地找三元素;总结就是i作为循环因子,然后slow和fast作为双指针,在nums[i]元素的的后面进行寻找;

11.24已完成

42. 接雨水 - 力扣(LeetCode)

个人认为最快的方法就是,前后缀;

通过前缀找到每个坐标点左侧的最大高度,通过后缀找到右侧最大高度,两者取最小值再减去桶的高度,就能得到这个坐标点水的高度,又因为横坐标都是1,因此该点的面积就是高度值;

为什么能用前后缀,就比如图中画粉色的这个面积,左边木板的高度取决于左边的最大高度,右边木板的高度取决于右边的最大高度,否则水就会流出去,因此才有了前缀后缀;

class Solution {
public:int trap(vector<int>& height) {int n = height.size();vector<int> pre_max(n);pre_max[0] = height[0];for(int i =1;i<n;i++){pre_max[i] = std::max(pre_max[i-1],height[i]);}vector<int> suf_max(n);suf_max[n-1] = height[n-1];for(int i=n-2;i>=0;i--){suf_max[i] = std::max(suf_max[i+1],height[i]);}int ans = 0;for(int i=0;i<n;i++){ans += min(pre_max[i],suf_max[i]) - height[i];}return ans;}
};
class Solution {
public:int trap(vector<int>& height) {int left=0, right = height.size()-1;int n = height.size();int pre_max=0, suf_max=0;int ans = 0;while(left<right){pre_max = max(pre_max,height[left]);suf_max = max(suf_max,height[right]);if(pre_max<suf_max) {ans+= pre_max - height[left];left+=1;}else{ans += suf_max -height[right];right -=1;}}return ans;}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com