寻找数组的中心下标

什么是中心下标?

其实就是在一个数组里面,一个元素的左边之和等于右边之和,这就是中心下标

如何实现了?

就是通过一个sum来算出来整个数组的元素之和,然后total开始赋值为o,然后让total一个一个数组的元素,从左到右,sum一个一个减,如果俩个相等了,那么这个元素被sum和total都用了,那么去掉这个元素,total和sum相等,那么这个元素就是中心元素,如果轮过了一轮,硬是没有,那就没有

代码实现:

java 复制代码
package com.fan.suanfati;

import java.util.Arrays;
/**
 *寻找中心数组
 * 其通过将数组的指针方式,让一开始算出整个数组的和sum,
 * 另外一个从头开始算total,那么每一次循环让total加一个元素,
 * sum减一个元素,如果其相等,那么必然都使用了这个元素,
 * 那么这个元素就是中心元素,中心元素就是其两边的数组元素加起来相等
 * 如果最后不存在中心元素,那么就返回-1
 * 然后再那么其共用了一个元素
 */


public class Test06 {
    public static void main(String[] args) {
        int  []  arr={1,5,3,4,4};
        int i = XunZhaoCenter(arr);
        System.out.println(i);
    }

    public   static   int   XunZhaoCenter(int  []  nums){
        int sum = Arrays.stream(nums).sum();
        int   total=0;
        for (int i = 0; i < nums.length; i++) {
            total+=nums[i];
            if (total==sum){
                return   i;
            }
            sum=sum-nums[i];
        }
        return -1;
    }
}

第二种方法:

注意:这次我把数组的总和设置成了total

其原理大致是nums[i]就是当前的元素,然后sum这次不包含当前元素也就是nums[i],这样根据原理,sum*2+nums[i]=total,根据这个原理,只要理解了这个原理,然后就把原理转化成代码,与一句话算法很简单,重点是要进行拆分,先把原理理解了,然后再用代码实现

代码:

java 复制代码
/**
     * 第二种方法:
     * 通过total是整个数组的总和,cur就是nums[i]
     * 那么cur也就是nums[i],如果cur+sum*2=total,根据这个原理来的
     * @param nums
     * @return
     */
    public   static   int  Method2(int   []   nums){
        int   total=Arrays.stream(nums).sum();
        int  sum=0;
        for (int i = 0; i < nums.length; i++) {
            if (sum+sum+nums[i]==total){
                return    i;
            }
            sum+=nums[i];
        }
        return   -1;
    }

所以,划重点了:我建议大家学习算法的时候准备纸笔,先把这个问题转化成数学问题,然后把这个问题给解决出来,当然了算法涉及的数学很简单,一般都是高中的最多也不超过高数,高数能听明白,基本没啥问题,然后再用代码实现,就这个小意思,重点是要学习,要输出,csdn是个非常好的平台,因为可以让我输出知识,让我可以把我对一个技术的理解分享给大家,也欢迎各位家人前来沟通交流,不断提升自己!最后感谢csdn平台,谢谢csdn!@csdn

相关推荐
学Linux的语莫10 分钟前
机器学习数据处理
java·算法·机器学习
找不到、了10 分钟前
JVM的即时编译JIT的介绍
java·jvm
earthzhang202141 分钟前
【1007】计算(a+b)×c的值
c语言·开发语言·数据结构·算法·青少年编程
西瓜er44 分钟前
JAVA:Spring Boot 集成 FFmpeg 实现多媒体处理
java·spring boot·ffmpeg
你总是一副不开心的样子(´ . .̫ .1 小时前
一、十天速通Java面试(第三天)
java·面试·职场和发展·java面试
迎風吹頭髮1 小时前
UNIX下C语言编程与实践63-UNIX 并发 Socket 编程:非阻塞套接字与轮询模型
java·c语言·unix
我是华为OD~HR~栗栗呀1 小时前
23届考研-Java面经(华为OD)
java·c++·python·华为od·华为·面试
Javatutouhouduan1 小时前
Java程序员如何深入学习JVM底层原理?
java·jvm·java面试·后端开发·java架构师·java程序员·互联网大厂
王嘉俊9251 小时前
设计模式--享元模式:优化内存使用的轻量级设计
java·设计模式·享元模式
2301_803554522 小时前
C++联合体(Union)详解:与结构体的区别、联系与深度解析
java·c++·算法