首页 > 其他分享 >数组part01

数组part01

时间:2024-07-31 21:51:34浏览次数:7  
标签:right nums part01 int 数组 left 指针

2024年7月31日,今日复习了数组的基础知识;巩固了二分法的写法,保证可以快速准确写出;学习了双指针的应用,双指针是为了让多个for循环压缩为一个循环,学习的时候尤其注意循环的写法。

1. 数组基础知识

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

几个特点:

  • 数组下标都是从0开始的。
  • 数组内存空间的地址是连续的。
  • 数组的元素是不能删的,只能覆盖。

C++中数组是连续存放的,java中就不是。所以未必。

2. 704 二分查找

最基本的mid,left和right,需要注意初始值right=nums.size()-1

while中是<=,因为=是有意义的。

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 (nums[middle] > target) {
                right = middle - 1; // target 在左区间,所以[left, middle - 1]
            } else if (nums[middle] < target) {
                left = middle + 1; // target 在右区间,所以[middle + 1, right]
            } else { // nums[middle] == target
                return middle; // 数组中找到目标值,直接返回下标
            }
        }
        return -1;
    }

3. 27 移除元素 (双指针)

初始思路:顺着往后看数组,只要是需要移除的val,就将val置为-1。结束以后,再来一个for循环,将数组往前移(这个过程是两个for嵌套)。

改进思路:不要再来一次for循环了,第一次遍历就将数组前移。需要两个指针。

双指针法,通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。

  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新 新数组下标的位置

需要注意这个遍历的写法,因为明确的知道每个快指针会遍历数组一次,所以for循环里写fast和数组的长度n即可。不要舍近求远用while倒腾了。

    int removeElement(vector<int>& nums, int val) {
        int n = nums.size();
        int left = 0;
        for (int right = 0; right < n; right++) {
            if (nums[right] != val) {
                nums[left] = nums[right];
                left++;
            }
        }
        return left;
    }

4. 977 有序数组的平方(双指针)

直接暴力解法:先平方再排序可以过。

双指针解法:

因为本来的数组是有序的,所以平方之后的最大值在两端出现。因此使用两个指针i和j分别指向两端,谁的平方大把谁放到结果r中。

  1. 注意循环的写法:i和j的初始值设置好,然后只需要保证i<=j,具体i和j的变化情况需要在循环中的if里分情况写。

    for(int i = 0,j = A.size()-1; i<=j;)

  2. i和j的平方相等可以单拿出来讨论,也可以不管,因为此次不放到r里,下个循环必会处理。

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;) { 
        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;
}

今日古诗

酹江月·夜凉

宋 黄升

西风解事,为人间、洗尽三庚烦暑。一枕新凉宜客梦,飞入藕花深处。冰雪襟怀,琉璃世界,夜气清如许。刬然长啸,起来秋满庭户。
应笑楚客才高,兰成愁悴,遗恨传千古。作赋吟诗空自好,不直一杯秋露。淡月阑干,微云河汉,耿耿天催曙。此情谁会,梧桐叶上疏雨。

标签:right,nums,part01,int,数组,left,指针
From: https://www.cnblogs.com/yuehuaicnblogs/p/18335572

相关文章

  • 学习日记:一维字符型数组
    目录1.格式2.字符串长度3.字符数组的输入输出3.1gets函数3.2puts函数3.3scanf函数3.4printf函数4.字符串处理函数4.1strlen函数(计算数组长度)4.2strcpy函数(复制字符串)4.3strcat函数(拼接字符串)4.4strcmp函数(比较字符串)1.格式数据类型数组名[数......
  • 数组(二)———数组的排序算法①
    目录冒泡排序基本步骤:复杂度分析实现示例(Java):选择排序基本步骤:复杂度分析实现示例(Java):插入排序基本步骤:复杂度分析实现示例(Java):希尔排序基本步骤:复杂度分析实现示例(Java):归并排序基本步骤:复杂度分析实现示例(Java):冒泡排序定义:冒泡排序(BubbleSort)是......
  • 后缀数组学习笔记
    前言后缀数组(SuffixArray,简称SA)是一种解决某些字符串问题的常用工具。解决这些字符串问题时,经常用后缀数组对问题进行一定的转化成其它的模型,然后套用那个模型的解决方法加以解决原问题。附题单约定本文做以下约定:本文撰写时间跨度较大,有些符号会出现正体、斜体混用的情......
  • 树状数组 | 维护区间和
    1.树状数组的定义树状数组(BinaryIndexedTree,简称BIT)是一种数据结构,能够高效地进行前缀和查询和单点更新操作。树状数组常用于解决频繁的区间和查询问题。2.树状数组的构建树状数组使用一个数组BIT[]来维护数据,其中BIT[i]存储从某个位置到当前位置的区间和。构建树状数组的......
  • 2024-07-31:用go语言,给定两个正整数数组arr1和arr2,我们要找到属于arr1的整数x和属于arr
    2024-07-31:用go语言,给定两个正整数数组arr1和arr2,我们要找到属于arr1的整数x和属于arr2的整数y组成的所有数对(x,y)中,具有最长公共前缀的长度。公共前缀是指两个数的最左边的一位或多位数字相同的部分。例如,对于整数5655359和56554来说,它们的公共前缀是565,而对于1223和434......
  • 2024-07-31:用go语言,给定两个正整数数组arr1和arr2,我们要找到属于arr1的整数x和属于arr
    2024-07-31:用go语言,给定两个正整数数组arr1和arr2,我们要找到属于arr1的整数x和属于arr2的整数y组成的所有数对(x,y)中,具有最长公共前缀的长度。公共前缀是指两个数的最左边的一位或多位数字相同的部分。例如,对于整数5655359和56554来说,它们的公共前缀是565,而对于1223和43456来说......
  • 二维数组下载为excel(导出)
    /*导出*/ consts2ab=function(s){ constbuf=newArrayBuffer(s.length); constview=newUint8Array(buf); for(leti=0;i<s.length;i++)view[i]=s.charCodeAt(i)&0xFF; returnbuf; } constexportClick=asyncfunction(){ //多个组数据......
  • 数组加密问题例题day05
    importjava.util.Scanner;/* 某个公司采用公用电话传递数据信息,数据是小于8位的整数,为了确保安全,在传递过程中需要加密,加密规则如下:首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字,最后将第一位和最后一位数字交换......
  • 树状数组
    树状数组一、单点修改和区间查询lowbit函数\[lowbit(x)=x\&(-x)\]作用:得到\(x\)二进制最右侧的1。如,\(x=(0010010011000)_2\),则\(-x=x取反+1=(1101101101000)_2\),\(x\&(-x)=(0000000001000)_2\)。原理用\(c[i]\)表示树状数组,\(a[i]\)表示原数组。将\(c[i]\)......
  • 如何根据数组中的数据在 matplotlib 中创建 3D 线图?
    我已经使用SciPy和脚本对洛伦兹方程进行了数值求解:#LorenzEquationsSciPysolverimportnumpyasnpfromscipyimportintegratefrommathimportcosfrommatplotlibimportpyplotasplta,b=0,100sigma,rho,beta=10,28,8/3N=1000000h=(b-a)/f......