首页 > 其他分享 >Day1数组+链表

Day1数组+链表

时间:2024-04-05 23:11:20浏览次数:25  
标签:ListNode val int nullptr next 链表 middle 数组 Day1

数组

while(不变量)--不变量循环

704.二分查找

https://leetcode.cn/problems/binary-search/

题目要求

  1. 数组升序

  2. 无重复数字

方法一-左闭右闭[]

  1. 左闭右闭区间[left,right],若nums[middle]!=target,则边界一定不包含middle;

  2. 用while循环,当找到了则直接返回,若没有则在while循环外返回-1;

 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; //=(left+right)/2
             if(nums[middle]<target){
                 left=middle+1;
            }else if(nums[middle]>target){
                 right=middle-1;
            }else{
                 return middle;
            }
        }
         return -1;
    }  
 };

方法二-左闭右开[,)

 class Solution {
 public:
     int search(vector<int>& nums, int target) {
         int left=0;
         int right=nums.size();
         while(left<right){  //[left,right) left=right时没有意义,当right=left+1时,则就是left这个数
             int middle=left+(right-left)/2; //=(left+right)/2
             if(nums[middle]<target){
                 left=middle+1;  //left是包含的,所以middle绝对不是的情况下,移动到middle+1
            }else if(nums[middle]>target){
                 right=middle;   //right是不包含的,所以刚好排除了middle
            }else{
                 return middle;
            }
        }
         return -1;
    }  
 };
  1. //2 python中整除

  2. >>1右移一位,==整除2

59.螺旋矩阵II

https://leetcode.cn/problems/spiral-matrix-ii/

我自己的想法:模拟顺时针++过程

问题:如何++;如何终止?

 class Solution {
 public:
     vector<vector<int>> generateMatrix(int n) {
         vector<vector<int>> matrix;
         for(int col1=0;col1<n;col1++){
             for(int row1=0;row1<n;row1++){
                 matrix[row1][col1]++;
                 for(int col2=n-1;col2>=0;col2--){
                     for(int row2=n-1;row2>=0;row2--){
                         matrix[]
                    }
                }
            }
        }
 ​
    }
 };

思路:

  1. 严格控制边界,明确左闭右开(每行每列)。所以注意遍历时j<n-offset-1(若刚开始offset=0)时,否则是遍历了左闭右闭。

  2. 注意每个循环包含上下两行,左右两列同时缩减1,所以体现在`offset+1,loop边界从n/2开始,loop==0跳出不变量循环,可以用n=1,2,3模拟判断。

  3. 注意n=1,2,3时,都是1圈,n=3时,多了一个中间的值`nums[middle][middle]=n*n。可以类比奇偶螺旋数组的情况。

 class Solution {
 public:
     vector<vector<int>> generateMatrix(int n) {
         vector<vector<int>> matrix(n,vector<int>(n,0));
         int startx=0,starty=0;
         int loop=n/2;
         int i,j;
         int count=1;
         int offset=1;  //左闭右开
         int middle=n/2;
     
         while(loop--){  //每次循环组,左闭右开
             i=startx;
             j=starty;
 ​
             //上行,左到右
             for(j=starty;j<n-offset;j++){   //如果offset=0,则j<n-offset-1,否则是左闭右闭
                 matrix[startx][j]=count++;
            }
             //右列,上到下
             for(i=startx;i<n-offset;i++){
                 matrix[i][j]=count++;
            }
             //下行,右到左
             for(;j>starty;j--){
                 matrix[i][j]=count++;
            }
             //左列,下到上
             for(;i>startx;i--){
                 matrix[i][j]=count++;
            }
             offset++;
             startx++;
             starty++;
        }
 ​
         //奇数n,单独给中间的元素赋值
         if(n%2==1){
             matrix[middle][middle]=n*n;
        }
         return matrix;
    }
 };

链表

链表基础

  1. 内存中可能不连续存放

  2. 头指针,尾指针;每个节点包含数据域和指针域;

  3. 单链表、双链表、循环链表(头尾相连)

  4. 链表的结构定义代码

 ​

203. 移除链表元素

虚拟头节点

  1. 节点的声明:ListNode* vnode= new ListNode(); ListNode* cur=vnode;后一个是同一个指针,不要重复删除;

  2. 指针域、数据域的引用:vnode->next,vnode->val

  3. 指针的移动:vnode=vode->next

 /**
  * Definition for singly-linked list.
  * struct ListNode {
  *     int val;
  *     ListNode *next;
  *     ListNode() : val(0), next(nullptr) {}
  *     ListNode(int x) : val(x), next(nullptr) {}
  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
  * };
  */
 class Solution {
 public:
     ListNode* removeElements(ListNode* head, int val) {
         ListNode* virhead=new ListNode();
         virhead->next=head;  //虚拟头节点,以防头节点就是空结点,或头节点的值=val
         ListNode* p=virhead;//遍历链表的索引节点,从虚拟结点开始
         while(p->next!=nullptr){ //不变量是遍历到链表末尾,特征是指针域=nullptr
             if(p->next->val==val){
                 p->next=p->next->next;
            }else{
                 p=p->next;
            }
        }
         return virhead->next;
    }
 };

包含内存回收

 /**
  * Definition for singly-linked list.
  * struct ListNode {
  *     int val;
  *     ListNode *next;
  *     ListNode() : val(0), next(nullptr) {}
  *     ListNode(int x) : val(x), next(nullptr) {}
  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
  * };
  */
 class Solution {
 public:
     ListNode* removeElements(ListNode* head, int val) {
         ListNode* virhead=new ListNode();
         virhead->next=head;  //虚拟头节点,以防头节点就是空结点,或头节点的值=val
         ListNode* p=virhead;//遍历链表的索引节点,从虚拟结点开始
         while(p->next!=nullptr){ //不变量是遍历到链表末尾,特征是指针域=nullptr
             if(p->next->val==val){
                 ListNode* temp=p->next;
                 p->next=p->next->next;
                 delete temp; //内存回收,delete关键字
            }else{
                 p=p->next;
            }
        }
         head=virhead->next;
         delete virhead;
         return head; //返回新的头节点
    }
 };

不带虚拟头节点

  1. 头节点连续等于val,while删除;判断删除后的头节点是否为null,直接返回null;

  2. 头节点不是val或者null,则正常判断删除操作。

 /**
  * Definition for singly-linked list.
  * struct ListNode {
  *     int val;
  *     ListNode *next;
  *     ListNode() : val(0), next(nullptr) {}
  *     ListNode(int x) : val(x), next(nullptr) {}
  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
  * };
  */
 
 class Solution {
 public:
     ListNode* removeElements(ListNode* head, int val) {
         //不设置虚拟节点
         while(head!=nullptr && head->val==val ){
             head=head->next;
        } //while 而不是if,新头节点
         
         // if(head==nullptr){
         //     return nullptr;
         // } //单独判断如果头节点为空,处理过后的头节点
         ListNode* p=head;
         while(head!=nullptr && p->next!=nullptr){
             if(p->next->val==val){
                 p->next=p->next->next;
            }
             else{
                 p=p->next;
            }
        }
         return head; //如果head是nullptr,直接返回即可
    }
 };
 

 

标签:ListNode,val,int,nullptr,next,链表,middle,数组,Day1
From: https://www.cnblogs.com/good-mind/p/18116544

相关文章

  • C++链表小册子
    目录1.简记2.多说两句3.算法题1.简记对于C++链表类的创建,有以下简记:堆分配,new作为右值。返回指针。对象生命周期手动管理,需要显式删除(delete)ListNodedummy(0);栈分配,返回ListNode。仅在作用域内生效(和常见的初始化int一样)。要得到ListNode指针需要&取地址2.多说两句......
  • C++基础——数组
    数组:就是相同数据类型的集合三种定义和初始化数组:(1)常规数组(C数组)定义最普通的一个定义方式,也是C语言风格数据类型数组名[数组大小](2)动态数组容器vector要加入头文件#include<vector>eg:定义一个整形类型的数组std::vector<int>num(10)push_back在容器后端增加元素......
  • Day1 数组第一章part01
    1.数组理论基础重点:数组是存放在连续内存空间上的相同类型数据的集合。数组下标都是从0开始的。数组内存空间的地址是连续的。正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。例如删除下标为3的元素,需要对下标......
  • ES6数组中删除指定元素
    ES6数组中删除指定元素 知识点:ES6从数组中删除指定元素findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引。否则返回-1。arr.splice(arr.findIndex(item=>item.id===data.id),1) http://louiszhai.github.io/2017/04/28/array/1:js中的spli......
  • c语言之指针数组
    在c语言中,一个数组元素是由指针组成的,就叫指针数组。指针数组的定义方法类型名*数组名[数组长度]如果要处理多个字符串,用指针数组会方便多。举个例子,代码如下#include<stdio.h>intmain(){ inti; char*s[]={"cprogram","control","logic"}; for(i=0;i<3;i++) ......
  • 【C语言学习】之字符数组与字符串处理函数
    1.字符数组1.字符数组的初始化1.单字符形式chara[3]={'a','b','c'}                定义一个字符型一维数组,数组名a,三个下表变量a,b,ccharb[][3]={'a','b','c','d','e','f','g'}  ......
  • 【C语言学习】之一维数组
    1.相同类型的变量可以构成数组,数组一次可以定义多个相同类型的变量既然是变量,肯定有定义和引用:1.一维数组的定义1.定义格式:数据类型数组名[整型常量]例如:inta[4],                    //定义了一个数组a包含4个整形变量括号里......
  • C++:数组元素逆置
    问题描述:请声明一个含有5个元素的数组,并且将元素逆置。如数组中的元素为1,3,2,5,4,逆置后为4,5,2,3,1。解题思路:1.创建一个含有5个元素的数组,并将其初始化2.实现逆置    2.1记录首元素下标start    2.2记录尾元素下标end    2.3交换首尾元素    ......
  • 【C语言系列】-- 数组结构
    数组结构前面介绍的数据类型都是基本数据类型,例如整型、字符型、浮点型等数据,这些都是简单的数据类型。对于有些数据,只有简单的数据类型是不够的,难以反映出数据的特点,也难以有效地进行处理。例如:假设需要接收并存储100个学员的成绩,此时无法使用for循环依次读取每个学员的成绩,因......
  • 001_Numpy数组
    1.手动构造数组importnumpyasnpimportseabornassnsimportmatplotlib.pyplotaspltimportmathfrommatplotlibimportcmdefvisualize_2D(array,vmax,vmin):fig_width=math.ceil(array.shape[1]*0.5)fig_length=math.ceil(array.shape[0]......