数组划分

本文介绍了一个在原地使用O(n)时间复杂度划分整数数组的算法案例,该算法将数组中小于给定值k的元素移至左侧,大于等于k的元素移至右侧,并返回第一个大于等于k的元素的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给出一个整数数组nums和一个整数k。划分数组(即移动数组nums中的元素),使得:

  • 所有小于k的元素移到左边
  • 所有大于等于k的元素移到右边

返回数组划分的位置,即数组中第一个位置i,满足nums[i]大于等于k。

样例
给出数组nums=[3,2,2,1]和 k=2,返回 1

注意
你应该真正的划分数组nums,而不仅仅只是计算比k小的整数数,如果数组nums中的所有元素都比k小,则返回nums.length。

挑战
要求在原地使用O(n)的时间复杂度来划分数组。


class Solution {
public:
    int partitionArray(vector<int> &nums, int k) {
        if(nums.empty()||nums.size()==0)
             return 0;
        int i=0, n=nums.size()-1;
        while(true) 
        {
            while(i<n&&nums[n]>=k)
            {
                n--;
            }
            while(i<n&&nums[i]<k) 
            {
                i++;
            }
            if(i==n) 
                break;
            swap(i,n,nums);
        }
        if(i==0 && nums[i]>=k) 
              return n;
        if(n==nums.size()-1 && nums[i]<k) 
              return n+1;
        return n+1;
    }
    void swap(int i,int n,vector<int> &nums)
    {
         int temp=nums[i];
         nums[i]=nums[n];
         nums[n]=temp;
    }
};


在C语言中,要将一个数组划分为两个长度接近的数组,可以采用动态内存分配和遍历的方式来实现。首先,你需要确定数组的总长度n,然后找到两个数a和b,使得a + b = n并且|a - b|是最小的。 下面是一个简单的示例算法: ```c #include <stdio.h> #include <stdlib.h> // 功能:计算两个整数的和,保证它们的和等于给定的目标值,并返回它们的差异 int findClosestSum(int arr[], int target, int i, int j) { if (i >= j) return abs(arr[i] - target); int diff1 = abs(arr[i] - target); int diff2 = abs(arr[j] - target); // 如果第一个元素更接近目标值,则直接返回 if (diff1 <= diff2) return diff1; // 否则,尝试将第二个元素加入到第一个数组中 return min(diff1, findClosestSum(arr, target - arr[j], i+1, j)); } // 主函数 void splitArray(int arr[], int n) { int minDiff = findClosestSum(arr, n / 2, 0, n - 1); printf("最小差距: %d\n", minDiff); // 分别创建两个数组 int* firstHalf = malloc((n - minDiff) * sizeof(int)); int* secondHalf = malloc(minDiff * sizeof(int)); // 将arr复制到firstHalf for (int i = 0; i < n - minDiff; i++) { firstHalf[i] = arr[i]; } // 将剩余部分复制到secondHalf for (int i = n - minDiff; i < n; i++) { secondHalf[i - (n - minDiff)] = arr[i]; } // 输出结果 printf("First half array: "); for (int i : firstHalf) { printf("%d ", i); } printf("\n"); printf("Second half array: "); for (int i : secondHalf) { printf("%d ", i); } printf("\n"); free(firstHalf); free(secondHalf); // 释放动态分配的内存 } int main() { int arr[] = {1, 2, 3, 4, 5, 6}; int n = sizeof(arr) / sizeof(arr[0]); splitArray(arr, n); return 0; } ``` 这个程序会找到最接近目标的一半数组长度,并据此分割原始数组。注意,实际应用中要检查`malloc()`的返回值,确保内存分配成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值