day1

发布时间 2023-04-05 22:38:46作者: wangyull

数组理论知识

对于C++而言,C++在二维数组的地址是连续的。

void test_arr() {
    int array[2][3] = {
        {0, 1, 2},
        {3, 4, 5}
    };
    cout << &array[0][0] << " " << &array[0][1] << " " << &array[0][2] << endl;
    cout << &array[1][0] << " " << &array[1][1] << " " << &array[1][2] << endl;
}

int main() {
    test_arr();
}

测试结果为

 

 

 704 二分查找

  给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

  使用二分法前提:数组为有序数组,数组中无重复元素

方法一:左闭右闭

 1 class Solution {
 2 public:
 3     int search(vector<int>& nums, int target) {
 4         int left=0;
 5         int right=nums.size()-1;
 6         while(left<=right)
 7         {
 8             int mid=(left+right)/2;
 9             if (nums[mid]<target)
10             {
11                 left=mid+1;
12             }else if(nums[mid]>target)
13             {
14                 right=mid-1;
15             }else{
16                 return mid;
17             }
18         }
19         return -1;
20 
21     }
22 };

方法二:左闭右开

 1 class Solution {
 2 public:
 3     int search(vector<int>& nums, int target) {
 4         int left=0;
 5         int right=nums.size();//从开始定义起就要遵守左闭右开
 6         while(left<right)
 7         {
 8             int mid=(left+right)/2;
 9             if (nums[mid]<target)
10             {
11                 left=mid+1;//左端点要取一个有效值,此时已知mid无效,故加一
12             }else if(nums[mid]>target)
13             {
14                 right=mid;//右端点实际上取不到,故可取已知无效mid值,实际有效值为mid-1
15             }else{
16                 return mid;
17             }
18         }
19         return -1;
20 
21     }
22 };

27.移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

方法一:暴力法

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

 

方法二:双指针

 个人感觉快指针用于浏览整个数组,慢指针是实际要留下来的值。如果快指针所浏览到的数不符合要求则不装入慢指针为首的数组。

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