1207.独一无二的出现次数
1207. 独一无二的出现次数 - 力扣(LeetCode)
给你一个整数数组 arr
,请你帮忙统计数组中每个数的出现次数。
1. 哈希法:用数组做哈希,首先将数组中的元素存入哈希数组中,然后遍历arr[i]的所有可能取值,如果这个数之前没出现过,return true;如果出现过,return false;
class Solution {
public:
bool uniqueOccurrences(vector<int>& arr) {
int count[20002] = {0};
for(int i = 0; i < arr.size(); i++) {
count[arr[i] + 1000]++;
}
// 统计是否出现过
bool fre[1002] = {false};
for(int i = 0; i <= 2000; i++) {
if(count[i]) {
if(fre[count[i]] == false) fre[count[i]] = true;
else return false;
}
}
return true;
}
};
189.旋转数组
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
1. 反转字符串:细节在于要把k编程nums.size()范围里的数
class Solution {
public:
void rotate(vector<int>& nums, int k) {
k = k % nums.size();
reverse(nums.begin(), nums.end());
reverse(nums.begin() + k, nums.end());
reverse(nums.begin(), nums.begin() + k);
}
};
2. 申请一个新数组
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
vector<int> newArr(n);
for(int i = 0; i < n; i++) {
newArr[(i + k) % n] = nums[i];
}
nums.assign(newArr.begin(), newArr.end());
}
};
724.寻找数组的中心下标
给你一个整数数组 nums
,请计算数组的 中心下标 。
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端,那么左侧数之和视为 0
,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。
如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1
。
1. 根据sum和leftSum计算出rightSum,判断leftSum和rightSum是否相等
class Solution {
public:
int pivotIndex(vector<int>& nums) {
int sum = 0;
for(int num : nums) sum += num; // 求和
int leftSum = 0; // 左半部分
int rightSum = 0; // 右半部分
for(int i = 0; i < nums.size(); i++) {
leftSum += nums[i];
rightSum = sum - leftSum + nums[i];
if(leftSum == rightSum) return i;
}
return -1;
}
};
922.按奇偶排序数组II
922. 按奇偶排序数组 II - 力扣(LeetCode)
给定一个非负整数数组 nums
, nums
中一半整数是 奇数 ,一半整数是 偶数 。
对数组进行排序,以便当 nums[i]
为奇数时,i
也是 奇数 ;当 nums[i]
为偶数时, i
也是 偶数 。
1. 暴力解法:首先把奇数存入奇数数组,把偶数存入偶数数组,最后把奇数数组和偶数数组存入结果数组
class Solution {
public:
vector<int> sortArrayByParityII(vector<int>& nums) {
vector<int> even(nums.size() / 2);
vector<int> odd(nums.size() / 2);
vector<int> result(nums.size());
int evenIndex = 0;
int oddIndex = 0;
int resultIndex = 0;
// 把nums数组放进偶数数组和奇数数组
for(int i = 0; i < nums.size(); i++) {
if(nums[i] % 2 == 0) even[evenIndex++] = nums[i];
else odd[oddIndex++] = nums[i];
}
// 把奇数数组和偶数数组存进结果数组
for(int i = 0; i < evenIndex; i++) {
result[resultIndex++] = even[i];
result[resultIndex++] = odd[i];
}
return result;
}
};
2.在一个数组上操作,如果在偶数位遇到奇数,那么就在奇数位找一个偶数存入偶数位
class Solution {
public:
vector<int> sortArrayByParityII(vector<int>& nums) {
int oddIndex = 1;
for(int i = 0; i < nums.size(); i += 2) {
if(nums[i] % 2 == 1) {
while(nums[oddIndex] % 2 != 0) oddIndex += 2;
swap(nums[i], nums[oddIndex]);
}
}
return nums;
}
};
至此艺术已成,全部的数组章节已经结束了,但是今天有点不舒服,早点休息了。
感谢代码随想录,感谢各位录友!
各位一起加油!