算法题:找出一个数组中和为n的两个数

题目

  • 有一个递增的数组 [1,2,4,7,11,15] 和 n = 15
  • 数组中有两个数,和是n。即 4 + 11 === 15
  • 写一个js函数,找出这两个数

常规思路

  • 循环嵌套
  • 时间复杂度是O(n^2),不可用

利用递增(有序)特性

  • 随便找两个数
  • 如果和大于n,则需要向前寻找
  • 如果和小于n,则需要向后寻找 —— 二分法思想(不是真正的二分)
  • 时间复杂度降低到O(n)
/**
 * @description 找出一个数组中和为n的两个数
 * @author lsr
 */

/**
 * 找出一个数组中和为n的两个数 - 嵌套循环
 * @param arr arr
 * @param n 和
 * @returns 返回这两个数
 */
export function findTwoNumbers1(arr: number[], n: number): number[] {
  const res: number[] = []
  const length = arr.length
  if (length === 0) return res

  let flag = false
  // O(n^2)
  for (let i = 0; i < length - 1; i++) {
    for (let j = 1; j < length; j++) {
      const sum = arr[i] + arr[j]
      if (sum === n) {
        res.push(arr[i])
        res.push(arr[j])
        flag = true
        break
      }
    }
    if (flag) break
  }

  return res
}

/**
 * 找出一个数组中和为n的两个数 - 双指针
 * @param arr arr
 * @param n 和
 * @returns 返回这两个数
 */
export function findTwoNumbers2(arr: number[], n: number): number[] {
  const res: number[] = []
  const length = arr.length
  if (length === 0) return res

  let i = 0 // 头
  let j = length - 1 // 尾
  while (i < j) {
    const sum = arr[i] + arr[j]
    if (sum > n) {
      // 当前和大于目标和,j 需向前移动
      j--
    } else if (sum < n) {
      // 当前和小于目标和,i 需向后移动
      i++
    } else {
      res.push(arr[i])
      res.push(arr[j])
      break
    }
  }

  return res
}

// 功能测试
const arr = [
  1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,
  1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 4, 7, 11, 15
]
const n = 15
// const res1 = findTwoNumbers1(arr, n)
// const res2 = findTwoNumbers2(arr, n)
// console.log(res1)
// console.log(res2)

// 性能测试
console.time('findTwoNumbers1')
for (let i = 0; i < 100 * 10000; i++) {
  findTwoNumbers1(arr, n)
}
console.timeEnd('findTwoNumbers1') // 1045.7412109375 ms

console.time('findTwoNumbers2')
for (let i = 0; i < 100 * 10000; i++) {
  findTwoNumbers2(arr, n)
}
console.timeEnd('findTwoNumbers2') // 69.4990234375 ms

单元测试

/**
 * @description 找出一个数组中和为n的两个数 test
 * @author lsr
 */

import {
  findTwoNumbers1,
  findTwoNumbers2
} from '@/01-algorithm/two-numbers-sum'

describe('找出一个数组中和为n的两个数', () => {
  it('空数组', () => {
    const res = findTwoNumbers2([], 15)
    expect(res).toEqual([])
  })

  it('正常情况', () => {
    const arr = [1, 2, 4, 7, 11, 15]
    const n = 15
    const res = findTwoNumbers2(arr, n)
    expect(res).toEqual([4, 11])
  })

  it('找不到的情况', () => {
    const arr = [1, 2, 4, 7, 11, 15]
    const n = 20
    const res = findTwoNumbers2(arr, n)
    expect(res).toEqual([])
  })
})

划重点

  • 时间复杂度达到O(n^2),是不可用算法
  • 凡有序,必二分!!!
  • 优化嵌套循环,可以考虑双指针
### 关于ArcGIS License Server无法启动的解决方案 当遇到ArcGIS License Server无法启动的情况,可以从以下几个方面排查并解决问题: #### 1. **检查网络配置** 确保License Server所在的计算机能够被其他客户端正常访问。如果是在局域网环境中部署了ArcGIS Server Local,则需要确认该环境下的网络设置是否允许远程连接AO组件[^1]。 #### 2. **验证服务状态** 检查ArcGIS Server Object Manager (SOM) 的运行情况。通常情况下,在Host SOM机器上需将此服务更改为由本地系统账户登录,并重启相关服务来恢复其正常工作流程[^2]。 #### 3. **审查日志文件** 查看ArcGIS License Manager的日志记录,寻找任何可能指示错误原因的信息。这些日志可以帮助识别具体是什么阻止了许可服务器的成功初始化。 #### 4. **权限问题** 确认用于启动ArcGIS License Server的服务账号具有足够的权限执行所需操作。这包括但不限于读取/写入特定目录的权利以及与其他必要进程通信的能力。 #### 5. **软件版本兼容性** 保证所使用的ArcGIS产品及其依赖项之间存在良好的版本匹配度。不一致可能会导致意外行为完全失败激活license server的功能。 #### 示例代码片段:修改服务登录身份 以下是更改Windows服务登录凭据的一个简单PowerShell脚本例子: ```powershell $serviceName = "ArcGISServerObjectManager" $newUsername = ".\LocalSystemUser" # 替换为实际用户名 $newPassword = ConvertTo-SecureString "" -AsPlainText -Force Set-Service -Name $serviceName -StartupType Automatic New-ServiceCredential -ServiceName $serviceName -Account $newUsername -Password $newPassword Restart-Service -Name $serviceName ``` 上述脚本仅作为示范用途,请依据实际情况调整参数值后再实施。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值