原地去重问题和合并有序数组问题

简介: 原地去重问题和合并有序数组问题

原地去重问题

c1ba12d0abf64d0d91ceee4e5a0196aa.png


这里我们可以使用三个指针来计算去重后一共有多少个值


首先是一个des指针


它负责来记录我们去重后一共有多少值以及用来给它们赋值


然后是begin和一个end指针


这两个指针的作用是用来保证它们的区间内没有任何重复的值


如果出现重复的值的话 那么久将end赋值给begin 并且des++ 之后再次寻找相同的区间


代码表示如下


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
  int arr[] = { 0,0,1,1,1,2,2,3,3,3,3,4,4,5,6,6,6,7 ,8};
  int sz = sizeof(arr)/sizeof(arr[0]);
  if (sz==0)
  {
    return 0;
  }
  int begin = 0;
  int end = 0;
  int des = 0;
  while (end<(sz-1))
  {
    if (arr[begin]==arr[end])
    {
      arr[des] = arr[begin];
      end++;
    }
    else if (arr[begin]!=arr[end])
    {
      begin = end;
      des++;
    }
  }
  printf("%d", des + 1);
  return 0;
}


至于这里为什么要加一呢? 因为实际上des表示的是数组的下标 下标比实际的元素少一

所以要加一


这里比较关键的有这么一段代码


if (sz==0)
{
  return 0;
}


如果说数组的大小其实是0个元素的话 那么其实重复的就是0个


合并有序数组问题


给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。


请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。


注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。


来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/merge-sorted-array


我们先来画图分析下问题


5905a3b8b1fc4dd09f0ab38fface0616.png

这一题也是一个典型的三指针问题 我们可以设立三个指针 一个指向数组m的最末尾位置


一个指向数组n的末尾位置 一个指向数组m的元素个位置


我们可以比较指向m或者n的两个指针的大小


如果说m的大就放在最后面去 m–


反之n就放在最后面去 n–


当数组n指向0位置前面的时候 可以不用变化了


当数组m指向0位置前面之后 还需要将n前面的所有数组迁移到数组m上去


代码表示如下


int main()
{
  int m[8] = { 4,5,6,9,0,0,0,0 };
  int n[4] = { 3, 6, 8, 10 };
  int m1 = 3;
  int n1 = 3;
  int end = 7;
  while ((n1>=0) && (m1>=0))
  {
    if (m[m1] > n[n1])
    {
      m[end] = m[m1];
      end--;
      m1--;
    }
    else
    {
      m[end] = n[n1];
      end--;
      n1--;
    }
  }
  while (n1 >= 0)
  {
    m[end] = n[n1];
    end--;
    n1--;
  }
  for (int i = 0; i < 8; i++)
  {
    printf("%d ", m[i]);
  }
  return 0;
}


以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏


希望大佬们看到错误之后能够不吝赐教 在评论区或者私信指正 博主一定及时修正


那么大家下期再见咯

相关文章
|
算法 前端开发
前端算法-删除有序数组中的重复项
前端算法-删除有序数组中的重复项
|
3月前
|
Python
【面试题解答】一个有序数组 nums ,原地删除重复出现的元素
【面试题解答】一个有序数组 nums ,原地删除重复出现的元素
30 0
|
5月前
|
算法 编译器
【归并排序】两个有序序列的合并
【归并排序】两个有序序列的合并
|
5月前
|
存储
原地去重问题和合并有序数组问题
原地去重问题和合并有序数组问题
22 0
|
6月前
|
算法 Java
算法题 合并两个有序数组
算法题 合并两个有序数组
29 1
|
6月前
|
存储 C++
合并两个有序数组(C++)
合并两个有序数组(C++)
71 0
|
6月前
|
算法 程序员 测试技术
【算法训练-数组 四】【数组合并】:合并两个有序数组
【算法训练-数组 四】【数组合并】:合并两个有序数组
49 0
|
C++
【C/C++练习】合并k个已排序的链表(二)
【C/C++练习】合并k个已排序的链表(二)
80 0
【C/C++练习】合并k个已排序的链表(二)
27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)上
27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)上
60 1