当前位置: 首页 > news >正文

1.2数组的基本算法设计

1.移除元素

//整体建表法--通过遍历整个数据集找出所有有效数据原地建表
//时间复杂度o(n),空间复杂度(1)
int removeLen(vector<int>& a ,int value) {
    int k = 0;
    for (int i = 0; i < a.size(); i++) {
        if (a[i] != value) {
            a[k] = a[i];
            k++;
        }
    }
    return k;
}
//元素移动法---覆盖或交换元素原地建表,删除移动元素较少时使用
//时间o(n),空间o(1)
int removeLen(vector<int>& a, int value) {
    int k = 0;
    for (int i = 0; i < a.size(); i++) {
        if (a[i] == value){

             k++;

        }
        else {
            a[i - k] = a[i];
        }
    }
    return a.size() - k;
}
//两区间划分法---可以划分为多个区间位置,此位置之前分别为一种状态
//然后从头遍历,属于哪个区间就交换到哪个区间去
int removeLen(vector<int>& a, int value) {
    int k = 0;
    for (int i = 0; i < a.size(); i++) {
        if (a[i] != value) {
            if (k != i) {
                swap(a[i], a[k]);
                k++;
            }
        }
    }
    return k;
}

2.移动0

//整体建表法
void print(vector<int>& nums, int value) {
    int k = 0;
    int i;
    for (i = 0; i < nums.size(); i++) {
        if (nums[i] != value) {
            nums[k] = nums[i];
            k++;
        }
    }
    for (i=k; i < nums.size(); i++) {
        nums[i] = 0;
    }
}
//元素移动法
void print(vector<int>& nums, int value) {
    int k = 0, i;
    for (i = 0; i < nums.size(); i++) {
        if (nums[i] == value) {
            k++;
        }
        else {
            nums[i - k] = nums[i];
        }
    }
    for (i = nums.size() - k; i < nums.size();i++) {
        nums[i] = 0;
    }
}
//区域划分法
//但不能保证非0元素相对位置不变
void print(vector<int>& nums, int value) {
    int k = 0, i;
    for (i = 0; i < nums.size(); i++) {
        if (nums[i] != value) {
            if (k != i) {
                swap(nums[i], nums[k]);
                k++;
            }
        }
    }
    for (i = k; i < nums.size(); i++) {
        nums[i] = 0;
    }
}

3.对数组执行操作(略--同2)

4.三颜色的分类

//区间划分法
void sortColors(vector<int>& nums, int value) {
    int a = 0, i = 0, b = nums.size() - 1;
    for (i = 0; i < nums.size(); i++) {
        if (nums[i] == 0) {
            if (i != a) {
                swap(nums[a], nums[i]);
            }
            a++;
        }
        else if (nums[i] == 2) {
            if (i != b) {
                swap(nums[i], nums[b]);
            }
            b--;
        }
    }
}

5.轮转数组

void reverse(vector<int>& nums, int first, int end) {
    while (first < end) {
        swap(nums[first], nums[end]);
        first++;
        end--;
    }
}
//元素交换法----对于给定的k中后面k个元素为a[n-k,n-1],前面n-k个元素为a[0,n-k-1],通过归纳发现规律进行处理数组a
void rotate(vector<int>& nums, int k) {
    int n = nums.size();
    int k = k % n;
    //将前元素逆置,后元素逆置,前后合并元素逆置
    reverse(nums, 0, n - k - 1);
    reverse(nums, n - k, n - 1);
    reverse(nums, 0, n - 1);
}

http://www.lryc.cn/news/570898.html

相关文章:

  • Minecraft-服务器领地(Residence插件)
  • 状态模式State Pattern
  • Myeclipse 10安装与激活
  • 性能测试——性能测试-常见性能指标-总体概况
  • 1KB快捷方式病毒的解决方法
  • C# 零基础搭建一个简单的Asp.Net Core WebAip服务
  • 当他成为SKY ——李晓峰
  • 5.5.2_2并查集的进一步优化
  • Cult3D高级教程——1.技术综合篇
  • sql脚本导入sql_学习SQL:SQL脚本
  • 16进制颜色代码对照表
  • Eighth season eighth episode,Monica got a stripper in her bachelorette party??????
  • foxmail6.0需要下载证书才能发送邮件的解决
  • 无线路由器接入局域网的三种方式
  • PowerManager与WakeLock
  • AI编程:正在拉开新一轮“人与人”的差距
  • canvas的drawImage方法参数详解
  • 网站点击流分析
  • 菜鸟成长手册:八大品牌内存真伪巧识别
  • 三款简单的日光灯驱动电路图分享
  • R语言——RStudio下载R包时总是下载不成功?解决方案
  • FckEditor中文配置手册详细说明
  • 智能土木通 - 土木工程专业知识问答系统01:项目简介
  • 2014校园招聘_腾讯2014校园招聘
  • 前端—每天5道面试题(十)
  • 【C语言】函数递归(有相关的题目练习喔~)
  • 1688图片搜索API接口攻略
  • 谷歌地图离线包-尝试
  • jQuery 和 YUI (Yahoo User Interface) 各自的优缺点有哪些?具体的使用场景是怎样的?...
  • 基于51单片机的温度和液位监测系统(串口传输)