【每日一题】力扣剑指 Offer II 075. 数组相对排序

简介: 【每日一题】力扣剑指 Offer II 075. 数组相对排序

解题思路

  1. 先根据arr2对arr1进行排序
  2. arr1的元素是要比arr2多或是相等的,根据arr2排完序后arr1后半段会有一段无序的小尾巴
  3. 再对小尾巴进行排序

代码

func relativeSortArray(arr1 []int, arr2 []int) []int {
  if arr1 == nil || len(arr1) == 1 {
    return arr1
  }
  l1 := len(arr1)
  l2 := len(arr2)
  n := 0
  // 已经排好序的不在参与排序
  for i := 0; i < l2 ; i++ {
    m := i + n
    for j := m; j < l1; j++ {
      if arr2[i] == arr1[j] {
        swap(arr1,m,j)
        //break
        m++
        n++
      }
    }
    n--
  }
  //fmt.Printf("%v",arr1)
  //fmt.Println(n)
  // 选择排序
  sort(arr1,l1,l2 + n)
  return arr1
}
// x不能等于Y
//func swap(arr1 []int,x, y int) {
//  arr1[x] = arr1[x] ^ arr1[y]
//  arr1[y] = arr1[x] ^ arr1[y]
//  arr1[x] = arr1[x] ^ arr1[y]
//}
func swap(arr1 []int,x, y int) {
  temp := arr1[x]
  arr1[x] = arr1[y]
  arr1[y] = temp
}
// 让数组在[l2,l1]之间排序
func sort(arr []int,l1,l2 int)  {
  for i := l2; i < l1 - 1; i++ {
    min := i
    for j := i + 1 ; j < l1; j++ {
      if arr[min] > arr[j] {
        min = j
      }
    }
    swap(arr,i,min)
  }
}


相关文章
|
14天前
|
C++ Python
二刷力扣--数组
二刷力扣--数组
|
15天前
|
索引
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
【LeetCode刷题】二分查找:山脉数组的峰顶索引、寻找峰值
|
15天前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
18天前
|
存储 算法 数据可视化
【模拟面试问答】深入解析力扣164题:最大间距(桶排序与排序方法详解)
【模拟面试问答】深入解析力扣164题:最大间距(桶排序与排序方法详解)
|
18天前
|
存储 算法 数据可视化
深入解读力扣154题:寻找旋转排序数组中的最小值 II(多种方法及详细ASCII图解)
深入解读力扣154题:寻找旋转排序数组中的最小值 II(多种方法及详细ASCII图解)
|
18天前
|
存储 算法 数据可视化
|
18天前
|
存储 传感器 算法
LeetCode题目89:格雷码 递归、迭代及位操作在数组合并中的应用
LeetCode题目89:格雷码 递归、迭代及位操作在数组合并中的应用
|
15天前
【LeetCode刷题】前缀和解决问题:742.寻找数组的中心下标、238.除自身以外数组的乘积
【LeetCode刷题】前缀和解决问题:742.寻找数组的中心下标、238.除自身以外数组的乘积
|
15天前
【LeetCode刷题】二分查找:寻找旋转排序数组中的最小值、点名
【LeetCode刷题】二分查找:寻找旋转排序数组中的最小值、点名
|
15天前
|
算法
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值