小白做题日记(13) 基础数组部分1.189. 轮转数组 - 力扣LeetCode方法一用一个新数组然后再复制回原数组扩充内容vector::asign:可以重新给vector批量赋值直接覆盖原来的全部内容还会自动扩容/缩容v.assign(5,99)给v填5个99v.assign(src.begin(),src.end());,拷贝别的序列的一段class Solution { public: void rotate(vectorint nums, int k) { int n nums.size(); vectorint v(n); for(int i 0;i n;i){ v[(i k) % n] nums[i]; } nums.assign(v.begin(),v.end()); } };但是不止于此题目在最后问我们方法二负负得正反转再反转图示出自力扣灵茶山艾府题解一目了然reverse函数是左闭右开区间class Solution { public: void rotate(vectorint nums, int k) { reverse(nums.begin(),nums.end()); k k % nums.size(); reverse(nums.begin(),nums.begin()k); reverse(nums.begin()k,nums.end()); } };时间复杂度O(n) 空间复杂度O(1)2.238. 除了自身以外数组的乘积 - 力扣LeetCode看起来很简单的一道题好像全乘起来再除nums[i]就行了但是题目中不允许使用除法而且就算使用除法num[i]0时这个方法是无法使用的。百思不得其解于是我们开始瞟题解。。。方法一以i为分割,设定数组l数组r表示当前i的左侧总乘积和右边总乘积然后l[i]*r[i]得到answer[i]class Solution { public: vectorint productExceptSelf(vectorint nums) { int n nums.size(); //这里的l[i]表示nums[i]左侧所有数的成绩 r[i]为右侧所有 vectorlong long l(n); vectorlong long r(n); vectorint answer(n); l[0] 1; r[n-1] 1; for(int i 1;i n;i){ l[i] l[i-1] * nums[i-1]; } for(int i n-2;i 0;i--){ r[i] r[i1]*nums[i1]; } for(int i 0;i n;i) answer[i] l[i] * r[i]; return answer; } };这时你看到了在题目的最后于是你又开始瞟题解。。方法二这真的很牛直接用answer数组进行记录因为是乘法所以可以直接往上面乘在记录右边的时候因为我们需要保留上次右侧的相乘的结果所以用变量r来保存这样可以实现在O(1)的空间复杂度完成这个题目实在是太美妙了。class Solution { public: vectorint productExceptSelf(vectorint nums) { int n nums.size(); //这里的l[i]表示nums[i]左侧所有数的成绩 r[i]为右侧所有 vectorint answer(n); answer[0] 1; answer[n-1] 1; for(int i 1;i n;i){ answer[i] answer[i-1] * nums[i-1]; } int r 1; for(int i n-1;i 0;i--){ answer[i] answer[i] * r; r r * nums[i]; } return answer; } };3.41. 缺失的第一个正数 - 力扣LeetCode我觉得他真的越来越过分了啊喂。。。。。这道题大家都会想到把数组存到哈希表里面然后再顺序查找是否存在但是这不满足题目中要使用常数级别的额外空间题解中使用的方法叫做原地哈希也就是将数组作为哈希表从头开始遍历nums[i]应该放到下标nums[i]-1的位置上于是对这两个数进行交换交换之后原本位于目标位置的数字会被换到当前位置 i而这个新数字可能还需要继续归位。因此需要使用while不断处理当前位置直到当前数字已经在正确位置当前数字不在[1,n]范围内当前数字的目标位置已经有相同数字。class Solution { public: int firstMissingPositive(vectorint nums) { int len nums.size(); for(int i 0;i len;i){ while(nums[i] 1 nums[i] len nums[nums[i]-1] ! nums[i]){ swap(nums,i,nums[i]-1); } } for(int i 0;i len;i){ if(nums[i] ! i1) return i1; } return len1; } void swap(vectorint nums,int index1,int index2){ int temp nums[index1]; nums[index1] nums[index2]; nums[index2] temp; } };下大雨了没带伞。。。。。。。。。。。。。可恶哇。。。。。。。。。