【从零开始写博客】数组运用:数组排序,字符串搜索和矩阵模拟(day2)

这篇具有很好参考价值的文章主要介绍了【从零开始写博客】数组运用:数组排序,字符串搜索和矩阵模拟(day2)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

代码随想录刷题60天

【数组】Day1


目录

代码随想录刷题60天

引例一:

排序算法

直接插入(直接排序)

冒泡排序

双指针法

快速排序(递归法)

引例二

​编辑

滑动窗口

引例三

总结与心得


引例一:

【从零开始写博客】数组运用:数组排序,字符串搜索和矩阵模拟(day2),算法,leetcode,数据结构

该题为leetcode上一道简单难度的题,该题需要解决的问题是对已有数组中的数据进行平方处理后排序。其中数据的平方处理并非本体的重点所在,而重点在于对数组进行排序。因此对数据进行怎样排序才是本题的关键所在,笔者也将在下面介绍几种排序算法。

排序算法

直接插入(直接排序)

class Solution
 {
public:
    vector<int> sortedSquares(vector<int>& nums) 
    {
       int temp,i,j;
		nums[0] = nums[0] * nums[0];
		for (i = 1; i < nums.size(); i++)
		{
			nums[i] = nums[i] * nums[i];
			if (nums[i] < nums[i - 1])
			{
				temp = nums[i];
				for (j = i - 1; j >= 0 && temp < nums[j]; j--)
					//这里必须先判断j是否是负数,否则会造成数组角标错误
					nums[j + 1] = nums[j];
				nums[j + 1] = temp;//j超出了for循环的作用域,因此必须在开头声明。
			}
		}
		return nums;
    }
};

冒泡排序

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

以上两种排序是最基本的两种排序算法,也初学者最容易理解并写出的两种排序算法,但由于两种算法都使用两层for循环嵌套,所以时间复杂度都是n的平方,时间复杂度较高,所以从效率方面考虑,这两种算法是不够理想的。而接下来的两种方法通过借助一些手段从而将算法的复杂度降低。

双指针法

class Solution
{
public:
	vector<int> sortedSquares(vector<int>& nums)
	{
		vector<int> res(nums.size());
		int i = 0, j = nums.size()-1;
		int k = j;
		while (i <= j)
		{
			if ((nums[i] * nums[i]) < (nums[j] * nums[j]))
				res[k--] = (nums[j] * nums[j--]);
			else
				res[k--] = (nums[i] * nums[i++]);
		}
		return res;
	}
};

该方法利用了“原本数组元素中,成员都是有序排列”的这一条件来进行思考,我们可以发现当所有成员取平方时,其最大值一定会出现在数组的左界或右界,利用这一特点,每次将最大元素从左右端取出,用一个数组进行存储,便得到我们需要的结果。这种利用已有条件设计的排序方法在本题中是最优解。

快速排序(递归法)

int Paritition(int arr[],int low,int high){
	int pivotLoc = arr[low];//将数组的第一个元素作为基准值
	int temp;

	while (low < high) {
		while (low < high && arr[high] >= pivotLoc)
			--high;//从右界开始,将第一个比基准值小的元素交换到左界(基准值于左界)
        temp = arr[low];
		arr[low] = arr[high];
		arr[high] = temp;//交换操作

		while (low < high && arr[low] <= pivotLoc)
			++low;//从
		temp = arr[low];
		arr[low] = arr[high];
		arr[high] = temp;//从左界开始,将第一个比基准值大的元素与基准值交换位置

	}
	return low;//返回此时的基准值角标
}

void QSort(int arr[], int n, int low, int hight) {
	int pivotloc;
	if (low < hight) {
		pivotloc = Paritition(arr, low, hight);
		QSort(arr, n, low, pivotloc - 1);
		QSort(arr, n, pivotloc + 1, hight);
	}
}

快速排序算法定义了两个指针一个指向数组头m一个指向数组尾n,然后以头指针为基准值先从尾指针开始向后找比基准值小的元素,找的之后交换m,n所指向的值,此时n所指向的值就是基准值,m开始向后找,找到比基准值大的交换。

在数组元素本身无序的情况下,这种排序算法往往有着较高的效率。

引例二

【从零开始写博客】数组运用:数组排序,字符串搜索和矩阵模拟(day2),算法,leetcode,数据结构

这道题有些类似于在字符串中寻找最长的连续相似字符。这道题我们当然可以使用暴力匹配进行处理,但这样处理在面对一些比较复杂的字符串时,往往效率不容乐观,因此我们可以借助一些巧妙方法来优化复杂度。 

滑动窗口

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

通过不断调整子数组的起始位置和终止位置,从而得到我们想要的结果。这种方法可以理解为双指针的一种。

引例三

【从零开始写博客】数组运用:数组排序,字符串搜索和矩阵模拟(day2),算法,leetcode,数据结构

 该题不涉及算法,是一道典型的模拟题,我们需要通过模拟螺旋顺序打印其过程。本题也重点考察做题者对矩阵边界的理解程度。

具体实例代码如下

class Solution 
{
public:
    vector<vector<int>> generateMatrix(int n)
    {
        vector<vector<int>> res(n, vector<int>(n, 0));
        int loop = (n - 1) / 2 + 1;
        int startX=0, startY=0;
        int count = 1;
        int offset = 0;
        
        while (loop > 0)
        {
            int i, j;
            for (i = startX; i < n - 1 - offset; i++) 
                res[startY][i] += count++;
            for (j = startY; j < n - 1 - offset; j++)
                res[j][i] += count++;
            for (; i > 0 + offset; i--)
                res[j][i] += count++;
            for (; j > 0 + offset; j--)
                res[j][i] += count++;
            startX++;
            startY++;
            offset++;
            loop--;
        }
        if (n / 2 == (n - 1) / 2)
            res[n / 2][n / 2] = n * n;
        //旋转矩阵最内层边长为1的矩阵由于“右开边界”而无法被赋值。
        return res;
    }
};

总结与心得

· 在数组的各种问题中,对于数组边界开闭的理解会很大程度影响解决问题的思路。

· 在做题过程中,我们可以通过一些我们已知的方法与技巧来优化本题的思考逻辑,与此同时也需要根据题目已知信息来简化本题的思考逻辑。因此,我们需要在不断积累各种方法的同时也要学会就题解题。文章来源地址https://www.toymoban.com/news/detail-576910.html

到了这里,关于【从零开始写博客】数组运用:数组排序,字符串搜索和矩阵模拟(day2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数组排序 sort() 方法 (映射对含有大小写的字符串进行排序)

    结论先行: sort() 方法: 用于对数组元素进行 排序 ,默认升序。如果指明了参数,那数组会按照 比较函数 的返回值进行排序。    sort() 方法比较两个值时,将值发送给比较函数,根据返回的(负、零、正)值对值进行排序。 举例,a 和 b 两个将要被比较的元素: 如果 a-

    2024年04月25日
    浏览(47)
  • 【从零开始写博客】链表运用:链表的增删查改及反转(day3)

    【数组】day2 【数组】day1 目录 链表概述 一、链表增删地初次理解 二、链表常见六个操作 三,链表的转置 总结 链表是通过指针将一个个节点串起来的数据结构,其优点是增删方便,灵活性强。以下将结合leetcode上的一些例题介绍链表的一些功能和应用。 相比数组依靠覆盖来

    2024年02月15日
    浏览(46)
  • 【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置

    ========================================================================= 主页点击直达: 个人主页 我的小仓库: 代码仓库 C语言偷着笑: C语言专栏 数据结构挨打小记: 初阶数据结构专栏 Linux被操作记: Linux专栏 LeetCode刷题掉发记: LeetCode刷题 算法: 算法专栏  C++头疼记: C++专栏 计算机

    2024年02月08日
    浏览(55)
  • mysql 解析json字符串、数组字符串、json数组字符串

    笔者使用mysql 5.7进行了一次json字符串的解析,因为一直在搞大数据相关的数据库、olap等,太久没有用mysql5.x的版本,一些函数已经不知道支不支持,我的同事建议我使用like、rlike模糊匹配的方式,身为数据人我不太喜欢用这种手段,因为他们比较低效。于是我想这里总结一下

    2024年02月16日
    浏览(56)
  • ES:字符串排序,字符串按照数字排序

    对一个字符串类型的字段进行排序通常不准确,因为已经被分词成多个词条了 字段虽然是字符串,但是其实值是整数, 排序按照字符串转成整数排序 解决方式:对字段索引两次,一次索引分词(用于搜索),一次索引不分词(用于排序) 期望按照字符串排序, 不分词 期望按照

    2024年02月11日
    浏览(44)
  • JS中字符串切割为数组/数组拼接为字符串

    (1)语法格式: 其中所选分隔符使用双引号(“”)或者单引号(‘’)括起来; 所生成的数组会存放于前面定义的数组变量中。 (2)样例: JS代码: 运行结果: (3)其他用法: ①当所选分隔符为空时,返回的数组即将每个字符分割出来: JS代码: 运行结果: ②分隔

    2024年02月12日
    浏览(58)
  • 从键盘输入一个字符串,将此字符串按字符的ASCII码值从小到大排序,并显示排序后的字符串。

    题面: 字符串排序:要求编写程序,将给定字符串中的字符,按照ASCII码顺序从小到大排序后输出。 输入格式: 输入是一个以回车结束的非空字符串。 输出格式: 输出排序后的结果字符串。 输入样例: bfh3q487ybefg734 输出样例: 3344778bbeffghqy 思路: Dwl同学一开始给我的代码

    2024年02月05日
    浏览(74)
  • Python 从字符串开始匹配

    从字符串开始匹配单个字符串 从字符串开始匹配多个字符串,匹配字符串以 元祖 的形式存储 re.match() 从字符串的开始进行匹配 Try to apply the pattern at the start of the string, returning a Match object, or None if no match was found. 注意: re.match() 的结果是对象,需要 .group() 获得匹配结果 re.s

    2024年02月13日
    浏览(60)
  • vue使用split()将字符串分割数组join()将数组转字符串reverse()将数组反转

    1.split() 将字符串切割成数组 输出如下 1.split()不传参数默认整个字符串作为数组的一个元素,返回包含原始字符串的数组 2.split(‘’)单引号不传参数默认将字符串拆分成一个个字符数组 如输入参数: const str = 123456789’ 拆分后:[‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’

    2023年04月08日
    浏览(44)
  • C++基础容器 -- C的数组和字符串和C++的数组和字符串

    数组 概念 代表内存里一组连续的同类型存储区 可以用来把多个存储区合并成一个整体 数组声明 int arr[10]; 类型名称int表述数组里面所有元素的类型 名称arr是数组的名称 整数10表示数组里面的元素个数 数组里元素个数不可以改变 使用 每个元素都有下标,通过下标可以直接访

    2024年02月06日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包