十大算法及其典型问题实践

ps: 十大算法合集,学习来源是尚硅谷Java数据结构与java算法,自留复习。1.二分法查找算法非递归实现 int binarySearch(int[] arr, int target) { int left = 0; int right = arr.length - 1; while (left <= right) { int mid = (left + right) / 2; if (arr[mid] >
摘要由CSDN通过智能技术生成

ps: 十大算法合集,学习来源是尚硅谷Java数据结构与java算法,自留复习。

1.二分法查找算法非递归实现

 int binarySearch(int[] arr, int target) {
   

      int left = 0;
      int right = arr.length - 1;
      while (left <= right) {
   
          int mid = (left + right) / 2;

          if (arr[mid] > target) {
   
              right = mid - 1;
          } else if (arr[mid] < target) {
   
              left = mid + 1;
          } else {
   
              return mid;
          }
      }
      return -1;
    }

2.分治算法和汉诺塔问题

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

void hanoTower(int num, char a, char b, char c) {
   
    if (num == 1) {
   
        //如果只有一个盘
        System.out.println("第1个盘从" + a + "->" + c);
    } else {
   
        //如果两个盘以上 看做下面一个盘和上面所有盘
        //先把上面的盘a->b 移动过程会使用到c
        hanoTower(num - 1, a, c, b);
        //把最下面的盘a->c
        System.out.println("第" + num + "个盘从" + a + "->" + c);
        //把b所有的盘b->c 移动过程会使用到a
        hanoTower(num - 1, b, a, c);
    }
}

3.动态规划算法和背包问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
算法实现

int[] w = {
   1, 4, 3};//物品重量
int[] value = {
   1500, 3000, 2000};
int m = 4;//背包容量
int n = value.length;//物品个数
//v[i][j]表示前i个物品中能装入容量为j的背包中的最大值
// 行标题是背包容量0 1 2 3 4  列标题是物品0 1500 3000 2000
int[][] v = new int[n + 1][m + 1];
//用来记录选择的搭配
int[][] path = new int[n + 1][m + 1];
//初始化 第一列 和 第一行
for (int i = 0; i < v.length; i++) {
   
    v[i][0] = 0;
}
for (int i = 0; i < v[0].length; i++) {
   
    v[0][i] = 0;
}

重点

//根据公式进行动态规划处理 不处理第一行及第一列
for (int i = 1; i < v.length; i++) {
   
    for (int j = 1; j < v[0].length; j++) {
   
        if (w[i - 1] > j) {
        //如果要加入的商品容量>背包容量  w[0]开始
            v[i][j] = v[i - 1][j];     //采用上一格的装配策略
        } else {
      //如果要加入的商品容量<背包容量
            //                               value,w从0开始
            //v[i][j] = Math.max(v[i - 1][j], value[i-1] + v[i - 1][j - w[i-1]]);
            if (v[i - 1][j] < value[i - 1] + v[i - 1][j - w[i - 1]]) {
   
                v[i][j] = value[i - 1] + v[i - 1][j - w[i - 1]];
                //把当前情况记录到path
                path[i][j] = 1;
            } else {
   
                v[i][j] = v[i - 1][j];
            }
        }
    }
}
//遍历输出v[i][j]
for (int i = 0; i < v.length; i++) {
   
    for (int j = 0; j < v[0].length; j++) {
   
        System.out.print(v[i][j] + " ");
    }
    System.out.println();
}
//输出path
for (int i = 0; i < path.length; i++) {
   
    for (int j = 0; j < path[i].length; j++) {
   
        if(path[i][j]==1) {
   
            System.out.print("第" + i + "个商品放入到背包中" + " ");
        }else{
   
            System.out.print(" * ");
        }
    }
    System.out.println();
}
//逆向遍历
int i = path.length - 1;
int j = path[0].length - 1;
while (i > 0 && j > 0) {
   
    if (path[i][j] == 1) {
   
        System.out.print("第" + i + "个商品放入到背包中" + " ");
        j -= w[i - 1];  //第i个商品的重量w[i - 1]
    }
    i--;
}

输出结果
在这里插入图片描述

4.KMP算法和字符匹配问题

在这里插入图片描述
暴力匹配

//暴力匹配算法  一个个字符依次去比较
![在这里插入图片描述](https://img-blog.csdnimg.cn/6e6170e154074462bfe8edbe08db945c.png)

static int violenceMatch(String str1, String str2) {
   
    char[] s1 = str1.toCharArray();
    char[] s2 = str2.toCharArray();
    int l1 = s1.length;
    int l2 = s2.length;
    int i = 0;//指向s1索引
    int j = 0;//指向s2索引
    while (i < l1 && j < l2) {
   //匹配时不可越界
        if (s1[i] == s2[j]) {
   
            i++;
            j++;
        } else {
   
            j = 0;
            i 
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值