leetcode [1] - 在排序数组中查找元素的第一个和最后一个位置.

本文介绍了使用二分查找法在排序数组中寻找元素的第一个和最后一个位置的算法,通过这种方法,可以快速定位目标元素。虽然存在优化空间,如改进循环结构,但可能会牺牲代码的可读性。这是一个基础的算法问题,旨在分享和娱乐。
摘要由CSDN通过智能技术生成

先看解法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static inline int* binarySeach(int* result, int* nums, int numsSize, int target) {
  int mid = (int)(numsSize / 2);
  int left_index = 0, right_index = numsSize - 1;
  while (left_index <= mid) {
    if (nums[left_index] == target) {
      if (result[0] == -1)
        result[0] = left_index;
      result[1] = left_index;
    }
    left_index++;
  }
  while (right_index >= mid) {
    if (nums[right_index] == target) {
      if (result[0] == -1 || result[0] > right_index)
        result[0] = right_index;
      if (result[1] == -1 || result[1] < right_index)
        result[1] = right_index;
    }
    right_index--;
  }
  return result;
}

static inline int* searchRange(int* nums, int numsSize, int target, int* returnSize) {
  int *result = malloc(sizeof(int) * 2);
  memset(result, -1, sizeof(int) * 2);
  *returnSize = 2;
  if (!nums)
    return result;
  if (!returnSize)
    return result;
  if (numsSize <= 0)
    return result;
  if (numsSize == 1){
    if (nums[0] == target )
      memset(result, 0x0, sizeof(int) * 2);
    return result;
  }
  return binarySeach(result, nums, numsSize, target);
}

int main(int argc, char const *argv[])
{
  int returnSize = 0;  // 返回的结果集必须为2;
  int nums_size = 6;   // 数组大小必须与nums一致;
  int target = 6;      // 要查找的数字必须大于等于0;
  int nums[] = {5,7,7,8,8,10}; // 数组
  
  int *result = searchRange(nums, nums_size, target, &returnSize);
  if (result == 2)
    printf("left = [%d], right = [%d], returnSize = [%d]\n", result[0], result[1], returnSize);
  return 0;
}

一拍脑子写的二分查找法, 提交后测试结果最快8ms,

优化空间主要在于将归并循环, 但是这样会降低可读性.

同时没有大心思钻进去玩, 发出来博大家一笑吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值