算法训练营Day1:数组相关
数组是存放在连续内存空间上的相同类型数据的集合。
数组下标都是从0开始的。
数组内存空间的地址是连续的。数组的元素是不能删除的,只能覆盖。换言之,由于数组在内存空间上的地址是连续的,所以我们在删除或者增添元素的时候,就需要移动其他元素。
二维数组的内存空间在C++上是连续的,但是在java等其他语言中就不一定了。
二分法查找元素
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1; //左闭右闭写法
while(left <= right){
int middle = left + ((right - left) / 2);
if(target < nums[middle]) {
right = middle -1;
}
else if(target > nums[middle]) {
left = middle + 1;
}
else{
return middle;
}
}
return -1;
}
};
暴力解数组去除元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
for(int i = 0; i <= size-1; i++ ){
if(nums[i] == val){
for(int j = i; j <= size -2; j++){
nums[j]= nums[j + 1];
}
i--;
size--;
}
}
return size;
}
};
有序数组的平方
暴力解法
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i = 0; i < nums.size(); i++){
nums[i] *= nums[i];
}
sort(nums.begin(), nums.end());
return nums;
}
};
双指针解法
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
int k = A.size() - 1;
vector<int> result(A.size(), 0);
for (int i = 0, j = A.size() - 1; i <= j;) { // 注意这里要i <= j,因为最后要处理两个元素
if (A[i] * A[i] < A[j] * A[j]) {
result[k--] = A[j] * A[j];
j--;
}
else {
result[k--] = A[i] * A[i];
i++;
}
}
return result;
}
};
评论区(暂无评论)